diff --git a/FrmDatabaseParaSettingOracle.cs b/FrmDatabaseParaSettingOracle.cs index 18c5e99..6e97dfb 100644 --- a/FrmDatabaseParaSettingOracle.cs +++ b/FrmDatabaseParaSettingOracle.cs @@ -47,12 +47,15 @@ } string serverIp = textBoxIP.Text.Trim(); + /* string hostName = System.Net.Dns.GetHostName(); if (serverIp == hostName || serverIp == "localhost" || serverIp == System.Net.Dns.GetHostAddresses(hostName).GetValue(2).ToString()) { serverIp = "127.0.0.1"; } + * */ + DateTime timeStart = DateTime.Now; GSODataSource ds = globeControl1.Globe.DataManager.GetDataSourceByName(serverIp + "/" + textBoxDatabase.Text.Trim() + "_" + textBoxUser.Text.Trim()); if (ds == null) @@ -83,7 +86,7 @@ connectParams.dataSourceName = ds.Name; connectParams.databaseType = EnumDataSourceType.Oracle; Utility.connectParamsOfDatabase.Add(connectParams); - + setUtilityValue(connectParams); WriteXML(); MessageBox.Show("连接Oracle数据库成功,用时:" + secondsConnectOracle.ToString() + "秒", "提示"); } @@ -92,6 +95,14 @@ this.Close(); } + private void setUtilityValue(DatabaseConnectParams connectParams) + { + Utility.DBServer = connectParams.ip; + Utility.Database = connectParams.databaseName; + Utility.UserID = connectParams.userName; + Utility.DBPassword = connectParams.password; + } + private void ReadXML() { string strFileName = Path.GetDirectoryName(Application.ExecutablePath) + "/databaseConfigOracle.xml"; diff --git a/FrmDatabaseParaSettingOracle.cs b/FrmDatabaseParaSettingOracle.cs index 18c5e99..6e97dfb 100644 --- a/FrmDatabaseParaSettingOracle.cs +++ b/FrmDatabaseParaSettingOracle.cs @@ -47,12 +47,15 @@ } string serverIp = textBoxIP.Text.Trim(); + /* string hostName = System.Net.Dns.GetHostName(); if (serverIp == hostName || serverIp == "localhost" || serverIp == System.Net.Dns.GetHostAddresses(hostName).GetValue(2).ToString()) { serverIp = "127.0.0.1"; } + * */ + DateTime timeStart = DateTime.Now; GSODataSource ds = globeControl1.Globe.DataManager.GetDataSourceByName(serverIp + "/" + textBoxDatabase.Text.Trim() + "_" + textBoxUser.Text.Trim()); if (ds == null) @@ -83,7 +86,7 @@ connectParams.dataSourceName = ds.Name; connectParams.databaseType = EnumDataSourceType.Oracle; Utility.connectParamsOfDatabase.Add(connectParams); - + setUtilityValue(connectParams); WriteXML(); MessageBox.Show("连接Oracle数据库成功,用时:" + secondsConnectOracle.ToString() + "秒", "提示"); } @@ -92,6 +95,14 @@ this.Close(); } + private void setUtilityValue(DatabaseConnectParams connectParams) + { + Utility.DBServer = connectParams.ip; + Utility.Database = connectParams.databaseName; + Utility.UserID = connectParams.userName; + Utility.DBPassword = connectParams.password; + } + private void ReadXML() { string strFileName = Path.GetDirectoryName(Application.ExecutablePath) + "/databaseConfigOracle.xml"; diff --git a/GXBuilder.cs b/GXBuilder.cs new file mode 100644 index 0000000..b2ec9b2 --- /dev/null +++ b/GXBuilder.cs @@ -0,0 +1,187 @@ +using System; +using System.Data; +using System.Drawing; +using System.Runtime.InteropServices; +using GeoScene.Data; +using GeoScene.Engine; +using GeoScene.Globe; + +namespace WorldGIS +{ + public class GXBuilder : ModelBuilder + { + private static double diameter = 0.1; + + public GXBuilder(GSODataSource ds) + : base(ds) + { + + } + + public override bool validate(GSOLayer layer) + { + return true; + } + + /// + /// + /// + /// 追加或修改 + /// 高程入库或埋深入库 + /// + public override bool doBuild(EnumUpdateMode updateMode, + EnumBuildMode buildMode, + BaseParam param) + { + LineParam lineParam = param as LineParam; + GSOFeatureDataset newFeatureSet = ds.GetDatasetByName(lineParam.layerName) as GSOFeatureDataset; + if (newFeatureSet == null) + { + newFeatureSet = CreateDBFeatureDataset(layer, lineParam.layerName); + } + newFeatureSet.Open(); + GSOFeatures features = layer.GetAllFeatures(true); + for (int i = 0; i < features.Length; i++) + { + GSOFeature f = features[i]; + GSOGeoPolyline3D lineeee = f.Geometry as GSOGeoPolyline3D; + if (lineeee == null || lineeee.GetSpaceLength(true, 6378137) == 0) + { + LogHelper.Error("出现数据无法入库:" + f.ID); + continue; + } + + GSOFeature newFeature = newFeatureSet.CreateFeature(); + + double radius = diameter; //创建光纤的半径 + newFeature.Geometry = updateGemotry(f, lineParam, radius, buildMode); + newFeature.Geometry.Style = getPipeLineStyle(lineParam, f, radius); + newFeature.Name = f.GetFieldAsString(lineParam.uniqueIdFieldName); + setFeatureValueByShapeFeature(f, newFeature); + // newFeatureSet + if (newFeatureSet.GetFeatureByName(newFeature.Name, true).Length > 0) + { + if (!this.UpdateGXDevice(newFeatureSet.GetFeatureByName(newFeature.Name, true)[0], + newFeature)) + { + LogHelper.Error("光纤设备更新失败:" + newFeature.Name+"\r\n"); + } + continue; + } + newFeatureSet.AddFeature(newFeature); + if (!AddGXDevice(newFeature)) + { + LogHelper.Error("光纤数据保存Alarm_Device失败:" + newFeature.Name+"\r\n"); + } + } + newFeatureSet.Save(); + newFeatureSet.Close(); + return true; + } + + private bool AddGXDevice(GSOFeature feature) + { + //保存数据到设备表 + try + { + String deviceType = feature.GetValue("DEVICETYPE") == null + ? "" : feature.GetValue("DEVICETYPE").ToString(); + String devCode = feature.GetValue("DEVICEID") == null + ? "" : feature.GetValue("DEVICEID").ToString(); + String road = feature.GetValue("ROAD") == null + ? "" : feature.GetValue("ROAD").ToString(); + + //TODO LIST: + string sqlCount = "select dbid from alarm_device_type where" + + " typename = '" + deviceType + "'"; + object dbid = OracleUtils.ExecuteScalar(OracleUtils.ConnectionString, + CommandType.Text, sqlCount); + if (dbid == null) + { + return false; + } + int deviceTypeId = int.Parse(dbid.ToString()); + string sql = "Insert into alarm_device (DBID,ACTIVE,DEVCODE,DEVNAME,FACTORY," + + "INSTALLDATE,GAOCHENG,HEIGHT,LATITUDE,LONGTITUDE,DEVICETYPE_ID) " + + "values (SEQ_DEVICE_ID.NEXTVAL, 1, '" + devCode + "', '" + deviceType + devCode + + "', " + "'航天二院', " + "to_date('" + DateTime.Now.ToString() + "','yyyy/MM/dd hh24:mi::ss'), " + + "0, 0, 0, 0, " + deviceTypeId + ")"; + OracleUtils.ExecuteNonQuery(OracleUtils.ConnectionString, CommandType.Text, sql); + + } + catch (Exception e) + { + throw; + } + return true; + } + + private bool UpdateGXDevice(GSOFeature feature, GSOFeature newFeature) + { + String deviceType = newFeature.GetValue("DEVICETYPE") == null + ? "" : newFeature.GetValue("DEVICETYPE").ToString(); + String devCode = newFeature.GetValue("DEVICEID") == null + ? "" : newFeature.GetValue("DEVICEID").ToString(); + String road = newFeature.GetValue("ROAD") == null + ? "" : newFeature.GetValue("ROAD").ToString(); + + feature.Geometry = newFeature.Geometry.Clone(); + this.setFeatureValueByShapeFeature(newFeature,feature); + // feature.Dataset.Save(); + + string sqlCount = "select dbid from alarm_device_type where" + + " typename = '" + deviceType + "'"; + object dbid = OracleUtils.ExecuteScalar(OracleUtils.ConnectionString, + CommandType.Text, sqlCount); + if (dbid == null) + { + return false; + } + int deviceTypeId = int.Parse(dbid.ToString()); + + string sql = "update alarm_device set FACTORY='" + road + + "', DEVICETYPE_ID='" + deviceTypeId + + "', DEVNAME='"+deviceType+devCode+"' "+ + "where devcode='" + devCode + "'"; + OracleUtils.ExecuteNonQuery(OracleUtils.ConnectionString, CommandType.Text, sql); + return true; + } + + private GSOLineStyle3D getPipeLineStyle(LineParam lineParam, GSOFeature f, double radius) + { + GSOPipeLineStyle3D style0 = new GSOPipeLineStyle3D(); + style0.LineColor = Color.FromArgb(lineParam.transparency, lineParam.lineColor); + style0.Slice = lineParam.sliceNum; + style0.CornerSliceAngle = lineParam.cornerSliceAngle; + style0.Radius = radius; + return style0; + } + + private GSOGeometry updateGemotry(GSOFeature f, LineParam lineParam, double radius, EnumBuildMode buildMode) + { + + f.Geometry.AltitudeMode = (buildMode.Equals(EnumBuildMode.Alititude)) ? EnumAltitudeMode.RelativeToGround : EnumAltitudeMode.Absolute; + + GSOGeoPolyline3D line = f.Geometry as GSOGeoPolyline3D; + if (line == null) + { + return null; //log4net 记录错误处理 + } + + double deep1 = 0; + double deep2 = 0; + + GSOPoint3ds pt3ds = new GSOPoint3ds(); + for (int n = 0; n < line[0].Count; n++) + { + GSOPoint3d pt3d = line[0][n]; + pt3d.Z = 0; + + pt3ds.Add(pt3d); + } + line[0] = pt3ds; + return line; + } + + } +} diff --git a/FrmDatabaseParaSettingOracle.cs b/FrmDatabaseParaSettingOracle.cs index 18c5e99..6e97dfb 100644 --- a/FrmDatabaseParaSettingOracle.cs +++ b/FrmDatabaseParaSettingOracle.cs @@ -47,12 +47,15 @@ } string serverIp = textBoxIP.Text.Trim(); + /* string hostName = System.Net.Dns.GetHostName(); if (serverIp == hostName || serverIp == "localhost" || serverIp == System.Net.Dns.GetHostAddresses(hostName).GetValue(2).ToString()) { serverIp = "127.0.0.1"; } + * */ + DateTime timeStart = DateTime.Now; GSODataSource ds = globeControl1.Globe.DataManager.GetDataSourceByName(serverIp + "/" + textBoxDatabase.Text.Trim() + "_" + textBoxUser.Text.Trim()); if (ds == null) @@ -83,7 +86,7 @@ connectParams.dataSourceName = ds.Name; connectParams.databaseType = EnumDataSourceType.Oracle; Utility.connectParamsOfDatabase.Add(connectParams); - + setUtilityValue(connectParams); WriteXML(); MessageBox.Show("连接Oracle数据库成功,用时:" + secondsConnectOracle.ToString() + "秒", "提示"); } @@ -92,6 +95,14 @@ this.Close(); } + private void setUtilityValue(DatabaseConnectParams connectParams) + { + Utility.DBServer = connectParams.ip; + Utility.Database = connectParams.databaseName; + Utility.UserID = connectParams.userName; + Utility.DBPassword = connectParams.password; + } + private void ReadXML() { string strFileName = Path.GetDirectoryName(Application.ExecutablePath) + "/databaseConfigOracle.xml"; diff --git a/GXBuilder.cs b/GXBuilder.cs new file mode 100644 index 0000000..b2ec9b2 --- /dev/null +++ b/GXBuilder.cs @@ -0,0 +1,187 @@ +using System; +using System.Data; +using System.Drawing; +using System.Runtime.InteropServices; +using GeoScene.Data; +using GeoScene.Engine; +using GeoScene.Globe; + +namespace WorldGIS +{ + public class GXBuilder : ModelBuilder + { + private static double diameter = 0.1; + + public GXBuilder(GSODataSource ds) + : base(ds) + { + + } + + public override bool validate(GSOLayer layer) + { + return true; + } + + /// + /// + /// + /// 追加或修改 + /// 高程入库或埋深入库 + /// + public override bool doBuild(EnumUpdateMode updateMode, + EnumBuildMode buildMode, + BaseParam param) + { + LineParam lineParam = param as LineParam; + GSOFeatureDataset newFeatureSet = ds.GetDatasetByName(lineParam.layerName) as GSOFeatureDataset; + if (newFeatureSet == null) + { + newFeatureSet = CreateDBFeatureDataset(layer, lineParam.layerName); + } + newFeatureSet.Open(); + GSOFeatures features = layer.GetAllFeatures(true); + for (int i = 0; i < features.Length; i++) + { + GSOFeature f = features[i]; + GSOGeoPolyline3D lineeee = f.Geometry as GSOGeoPolyline3D; + if (lineeee == null || lineeee.GetSpaceLength(true, 6378137) == 0) + { + LogHelper.Error("出现数据无法入库:" + f.ID); + continue; + } + + GSOFeature newFeature = newFeatureSet.CreateFeature(); + + double radius = diameter; //创建光纤的半径 + newFeature.Geometry = updateGemotry(f, lineParam, radius, buildMode); + newFeature.Geometry.Style = getPipeLineStyle(lineParam, f, radius); + newFeature.Name = f.GetFieldAsString(lineParam.uniqueIdFieldName); + setFeatureValueByShapeFeature(f, newFeature); + // newFeatureSet + if (newFeatureSet.GetFeatureByName(newFeature.Name, true).Length > 0) + { + if (!this.UpdateGXDevice(newFeatureSet.GetFeatureByName(newFeature.Name, true)[0], + newFeature)) + { + LogHelper.Error("光纤设备更新失败:" + newFeature.Name+"\r\n"); + } + continue; + } + newFeatureSet.AddFeature(newFeature); + if (!AddGXDevice(newFeature)) + { + LogHelper.Error("光纤数据保存Alarm_Device失败:" + newFeature.Name+"\r\n"); + } + } + newFeatureSet.Save(); + newFeatureSet.Close(); + return true; + } + + private bool AddGXDevice(GSOFeature feature) + { + //保存数据到设备表 + try + { + String deviceType = feature.GetValue("DEVICETYPE") == null + ? "" : feature.GetValue("DEVICETYPE").ToString(); + String devCode = feature.GetValue("DEVICEID") == null + ? "" : feature.GetValue("DEVICEID").ToString(); + String road = feature.GetValue("ROAD") == null + ? "" : feature.GetValue("ROAD").ToString(); + + //TODO LIST: + string sqlCount = "select dbid from alarm_device_type where" + + " typename = '" + deviceType + "'"; + object dbid = OracleUtils.ExecuteScalar(OracleUtils.ConnectionString, + CommandType.Text, sqlCount); + if (dbid == null) + { + return false; + } + int deviceTypeId = int.Parse(dbid.ToString()); + string sql = "Insert into alarm_device (DBID,ACTIVE,DEVCODE,DEVNAME,FACTORY," + + "INSTALLDATE,GAOCHENG,HEIGHT,LATITUDE,LONGTITUDE,DEVICETYPE_ID) " + + "values (SEQ_DEVICE_ID.NEXTVAL, 1, '" + devCode + "', '" + deviceType + devCode + + "', " + "'航天二院', " + "to_date('" + DateTime.Now.ToString() + "','yyyy/MM/dd hh24:mi::ss'), " + + "0, 0, 0, 0, " + deviceTypeId + ")"; + OracleUtils.ExecuteNonQuery(OracleUtils.ConnectionString, CommandType.Text, sql); + + } + catch (Exception e) + { + throw; + } + return true; + } + + private bool UpdateGXDevice(GSOFeature feature, GSOFeature newFeature) + { + String deviceType = newFeature.GetValue("DEVICETYPE") == null + ? "" : newFeature.GetValue("DEVICETYPE").ToString(); + String devCode = newFeature.GetValue("DEVICEID") == null + ? "" : newFeature.GetValue("DEVICEID").ToString(); + String road = newFeature.GetValue("ROAD") == null + ? "" : newFeature.GetValue("ROAD").ToString(); + + feature.Geometry = newFeature.Geometry.Clone(); + this.setFeatureValueByShapeFeature(newFeature,feature); + // feature.Dataset.Save(); + + string sqlCount = "select dbid from alarm_device_type where" + + " typename = '" + deviceType + "'"; + object dbid = OracleUtils.ExecuteScalar(OracleUtils.ConnectionString, + CommandType.Text, sqlCount); + if (dbid == null) + { + return false; + } + int deviceTypeId = int.Parse(dbid.ToString()); + + string sql = "update alarm_device set FACTORY='" + road + + "', DEVICETYPE_ID='" + deviceTypeId + + "', DEVNAME='"+deviceType+devCode+"' "+ + "where devcode='" + devCode + "'"; + OracleUtils.ExecuteNonQuery(OracleUtils.ConnectionString, CommandType.Text, sql); + return true; + } + + private GSOLineStyle3D getPipeLineStyle(LineParam lineParam, GSOFeature f, double radius) + { + GSOPipeLineStyle3D style0 = new GSOPipeLineStyle3D(); + style0.LineColor = Color.FromArgb(lineParam.transparency, lineParam.lineColor); + style0.Slice = lineParam.sliceNum; + style0.CornerSliceAngle = lineParam.cornerSliceAngle; + style0.Radius = radius; + return style0; + } + + private GSOGeometry updateGemotry(GSOFeature f, LineParam lineParam, double radius, EnumBuildMode buildMode) + { + + f.Geometry.AltitudeMode = (buildMode.Equals(EnumBuildMode.Alititude)) ? EnumAltitudeMode.RelativeToGround : EnumAltitudeMode.Absolute; + + GSOGeoPolyline3D line = f.Geometry as GSOGeoPolyline3D; + if (line == null) + { + return null; //log4net 记录错误处理 + } + + double deep1 = 0; + double deep2 = 0; + + GSOPoint3ds pt3ds = new GSOPoint3ds(); + for (int n = 0; n < line[0].Count; n++) + { + GSOPoint3d pt3d = line[0][n]; + pt3d.Z = 0; + + pt3ds.Add(pt3d); + } + line[0] = pt3ds; + return line; + } + + } +} diff --git a/HTForms/FrmPipelineModelDataBase.cs b/HTForms/FrmPipelineModelDataBase.cs index 84a2d7b..3076bdd 100644 --- a/HTForms/FrmPipelineModelDataBase.cs +++ b/HTForms/FrmPipelineModelDataBase.cs @@ -91,6 +91,7 @@ } else datasource = ds; + if (comboBoxExLayer.Text.Trim() == "") { MessageBox.Show("请选择一个图层文件!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning); @@ -126,20 +127,12 @@ comboBoxExLayer.Text)); if (layer == null) return; - FieldValidate fieldValidate = FieldValidateFactory.Create(ValidateConfig.LoadConfig(), - getEnumValidateType()); - - if (!fieldValidate.Validate(layer)) + if (txtModelLayer.Text != "传感设备图层") { - DateTime dt=DateTime.Now; - string logFilePath = Application.StartupPath + "\\log\\" + dt.Year + "\\" + dt.Year + dt.Month + "\\" + dt.Year + - dt.Month + dt.Day + ".txt"; - MessageBox.Show("选择的数据不符合数据规范,详情见日志" + logFilePath, "提示"); - return; + if (!getValidateResult(layer)) + return; } - ModelBuilder lineBuilder = new LineBuilder(datasource); - LineParam lineParam = new LineParam(); lineParam.layerName = txtModelLayer.Text; lineParam.uniqueIdFieldName = cmbID.Text; @@ -149,14 +142,17 @@ lineParam.diameterFieldName = cmbRadius.Text; lineParam.relativeMode = (cmbReference.Text == "管顶") ? 0 : 1; lineParam.lineColor = btnPipelineColor.BackColor; - lineParam.transparency=Convert.ToByte(ComboboxRansparency.Value); + lineParam.transparency = Convert.ToByte(ComboboxRansparency.Value); lineParam.cornerSliceAngle = Convert.ToDouble(textBoxCornerSliceAngle.Text); - lineParam.sliceNum=Convert.ToInt32(txtSlice.Text); + lineParam.sliceNum = Convert.ToInt32(txtSlice.Text); lineParam.channelWidth = comboBoxExWidth.Text; lineParam.channelHeight = comboBoxExHeight.Text; - lineBuilder.build(layer, checkBoxAdd.Checked ? EnumUpdateMode.Append : EnumUpdateMode.Update, - checkBoxDeep.Checked ? EnumBuildMode.Depth : EnumBuildMode.Alititude, lineParam); + if (txtModelLayer.Text != "传感设备图层") + lineBuilder(layer, lineParam); + else + gxLineBuilder(layer, lineParam); + addLayerToGlobeControl(lineParam.layerName); //this.DialogResult = DialogResult.OK; MessageBox.Show("入库完成!", "提示"); @@ -167,6 +163,33 @@ } } + bool getValidateResult(GSOLayer layer) + { + FieldValidate fieldValidate = FieldValidateFactory.Create(ValidateConfig.LoadConfig(), + getEnumValidateType()); + + if (fieldValidate.Validate(layer)) return true; + DateTime dt = DateTime.Now; + string logFilePath = Application.StartupPath + "\\log\\" + dt.Year + "\\" + dt.Year + dt.Month + + "\\" + dt.Year + dt.Month + dt.Day + ".txt"; + MessageBox.Show("选择的数据不符合数据规范,详情见日志" + logFilePath, "提示"); + return false; + } + + void lineBuilder(GSOLayer layer,LineParam lineParam) + { + ModelBuilder lineBuilder = new LineBuilder(datasource); + lineBuilder.build(layer, checkBoxAdd.Checked ? EnumUpdateMode.Append : EnumUpdateMode.Update, + checkBoxDeep.Checked ? EnumBuildMode.Depth : EnumBuildMode.Alititude, lineParam); + } + + void gxLineBuilder(GSOLayer layer, LineParam lineParam) + { + ModelBuilder lineBuilder = new GXBuilder(datasource); + lineBuilder.build(layer, checkBoxAdd.Checked ? EnumUpdateMode.Append : EnumUpdateMode.Update, + checkBoxDeep.Checked ? EnumBuildMode.Depth : EnumBuildMode.Alititude, lineParam); + } + private EnumValidateType getEnumValidateType() { if (comboBoxExWidth.Text != "") diff --git a/FrmDatabaseParaSettingOracle.cs b/FrmDatabaseParaSettingOracle.cs index 18c5e99..6e97dfb 100644 --- a/FrmDatabaseParaSettingOracle.cs +++ b/FrmDatabaseParaSettingOracle.cs @@ -47,12 +47,15 @@ } string serverIp = textBoxIP.Text.Trim(); + /* string hostName = System.Net.Dns.GetHostName(); if (serverIp == hostName || serverIp == "localhost" || serverIp == System.Net.Dns.GetHostAddresses(hostName).GetValue(2).ToString()) { serverIp = "127.0.0.1"; } + * */ + DateTime timeStart = DateTime.Now; GSODataSource ds = globeControl1.Globe.DataManager.GetDataSourceByName(serverIp + "/" + textBoxDatabase.Text.Trim() + "_" + textBoxUser.Text.Trim()); if (ds == null) @@ -83,7 +86,7 @@ connectParams.dataSourceName = ds.Name; connectParams.databaseType = EnumDataSourceType.Oracle; Utility.connectParamsOfDatabase.Add(connectParams); - + setUtilityValue(connectParams); WriteXML(); MessageBox.Show("连接Oracle数据库成功,用时:" + secondsConnectOracle.ToString() + "秒", "提示"); } @@ -92,6 +95,14 @@ this.Close(); } + private void setUtilityValue(DatabaseConnectParams connectParams) + { + Utility.DBServer = connectParams.ip; + Utility.Database = connectParams.databaseName; + Utility.UserID = connectParams.userName; + Utility.DBPassword = connectParams.password; + } + private void ReadXML() { string strFileName = Path.GetDirectoryName(Application.ExecutablePath) + "/databaseConfigOracle.xml"; diff --git a/GXBuilder.cs b/GXBuilder.cs new file mode 100644 index 0000000..b2ec9b2 --- /dev/null +++ b/GXBuilder.cs @@ -0,0 +1,187 @@ +using System; +using System.Data; +using System.Drawing; +using System.Runtime.InteropServices; +using GeoScene.Data; +using GeoScene.Engine; +using GeoScene.Globe; + +namespace WorldGIS +{ + public class GXBuilder : ModelBuilder + { + private static double diameter = 0.1; + + public GXBuilder(GSODataSource ds) + : base(ds) + { + + } + + public override bool validate(GSOLayer layer) + { + return true; + } + + /// + /// + /// + /// 追加或修改 + /// 高程入库或埋深入库 + /// + public override bool doBuild(EnumUpdateMode updateMode, + EnumBuildMode buildMode, + BaseParam param) + { + LineParam lineParam = param as LineParam; + GSOFeatureDataset newFeatureSet = ds.GetDatasetByName(lineParam.layerName) as GSOFeatureDataset; + if (newFeatureSet == null) + { + newFeatureSet = CreateDBFeatureDataset(layer, lineParam.layerName); + } + newFeatureSet.Open(); + GSOFeatures features = layer.GetAllFeatures(true); + for (int i = 0; i < features.Length; i++) + { + GSOFeature f = features[i]; + GSOGeoPolyline3D lineeee = f.Geometry as GSOGeoPolyline3D; + if (lineeee == null || lineeee.GetSpaceLength(true, 6378137) == 0) + { + LogHelper.Error("出现数据无法入库:" + f.ID); + continue; + } + + GSOFeature newFeature = newFeatureSet.CreateFeature(); + + double radius = diameter; //创建光纤的半径 + newFeature.Geometry = updateGemotry(f, lineParam, radius, buildMode); + newFeature.Geometry.Style = getPipeLineStyle(lineParam, f, radius); + newFeature.Name = f.GetFieldAsString(lineParam.uniqueIdFieldName); + setFeatureValueByShapeFeature(f, newFeature); + // newFeatureSet + if (newFeatureSet.GetFeatureByName(newFeature.Name, true).Length > 0) + { + if (!this.UpdateGXDevice(newFeatureSet.GetFeatureByName(newFeature.Name, true)[0], + newFeature)) + { + LogHelper.Error("光纤设备更新失败:" + newFeature.Name+"\r\n"); + } + continue; + } + newFeatureSet.AddFeature(newFeature); + if (!AddGXDevice(newFeature)) + { + LogHelper.Error("光纤数据保存Alarm_Device失败:" + newFeature.Name+"\r\n"); + } + } + newFeatureSet.Save(); + newFeatureSet.Close(); + return true; + } + + private bool AddGXDevice(GSOFeature feature) + { + //保存数据到设备表 + try + { + String deviceType = feature.GetValue("DEVICETYPE") == null + ? "" : feature.GetValue("DEVICETYPE").ToString(); + String devCode = feature.GetValue("DEVICEID") == null + ? "" : feature.GetValue("DEVICEID").ToString(); + String road = feature.GetValue("ROAD") == null + ? "" : feature.GetValue("ROAD").ToString(); + + //TODO LIST: + string sqlCount = "select dbid from alarm_device_type where" + + " typename = '" + deviceType + "'"; + object dbid = OracleUtils.ExecuteScalar(OracleUtils.ConnectionString, + CommandType.Text, sqlCount); + if (dbid == null) + { + return false; + } + int deviceTypeId = int.Parse(dbid.ToString()); + string sql = "Insert into alarm_device (DBID,ACTIVE,DEVCODE,DEVNAME,FACTORY," + + "INSTALLDATE,GAOCHENG,HEIGHT,LATITUDE,LONGTITUDE,DEVICETYPE_ID) " + + "values (SEQ_DEVICE_ID.NEXTVAL, 1, '" + devCode + "', '" + deviceType + devCode + + "', " + "'航天二院', " + "to_date('" + DateTime.Now.ToString() + "','yyyy/MM/dd hh24:mi::ss'), " + + "0, 0, 0, 0, " + deviceTypeId + ")"; + OracleUtils.ExecuteNonQuery(OracleUtils.ConnectionString, CommandType.Text, sql); + + } + catch (Exception e) + { + throw; + } + return true; + } + + private bool UpdateGXDevice(GSOFeature feature, GSOFeature newFeature) + { + String deviceType = newFeature.GetValue("DEVICETYPE") == null + ? "" : newFeature.GetValue("DEVICETYPE").ToString(); + String devCode = newFeature.GetValue("DEVICEID") == null + ? "" : newFeature.GetValue("DEVICEID").ToString(); + String road = newFeature.GetValue("ROAD") == null + ? "" : newFeature.GetValue("ROAD").ToString(); + + feature.Geometry = newFeature.Geometry.Clone(); + this.setFeatureValueByShapeFeature(newFeature,feature); + // feature.Dataset.Save(); + + string sqlCount = "select dbid from alarm_device_type where" + + " typename = '" + deviceType + "'"; + object dbid = OracleUtils.ExecuteScalar(OracleUtils.ConnectionString, + CommandType.Text, sqlCount); + if (dbid == null) + { + return false; + } + int deviceTypeId = int.Parse(dbid.ToString()); + + string sql = "update alarm_device set FACTORY='" + road + + "', DEVICETYPE_ID='" + deviceTypeId + + "', DEVNAME='"+deviceType+devCode+"' "+ + "where devcode='" + devCode + "'"; + OracleUtils.ExecuteNonQuery(OracleUtils.ConnectionString, CommandType.Text, sql); + return true; + } + + private GSOLineStyle3D getPipeLineStyle(LineParam lineParam, GSOFeature f, double radius) + { + GSOPipeLineStyle3D style0 = new GSOPipeLineStyle3D(); + style0.LineColor = Color.FromArgb(lineParam.transparency, lineParam.lineColor); + style0.Slice = lineParam.sliceNum; + style0.CornerSliceAngle = lineParam.cornerSliceAngle; + style0.Radius = radius; + return style0; + } + + private GSOGeometry updateGemotry(GSOFeature f, LineParam lineParam, double radius, EnumBuildMode buildMode) + { + + f.Geometry.AltitudeMode = (buildMode.Equals(EnumBuildMode.Alititude)) ? EnumAltitudeMode.RelativeToGround : EnumAltitudeMode.Absolute; + + GSOGeoPolyline3D line = f.Geometry as GSOGeoPolyline3D; + if (line == null) + { + return null; //log4net 记录错误处理 + } + + double deep1 = 0; + double deep2 = 0; + + GSOPoint3ds pt3ds = new GSOPoint3ds(); + for (int n = 0; n < line[0].Count; n++) + { + GSOPoint3d pt3d = line[0][n]; + pt3d.Z = 0; + + pt3ds.Add(pt3d); + } + line[0] = pt3ds; + return line; + } + + } +} diff --git a/HTForms/FrmPipelineModelDataBase.cs b/HTForms/FrmPipelineModelDataBase.cs index 84a2d7b..3076bdd 100644 --- a/HTForms/FrmPipelineModelDataBase.cs +++ b/HTForms/FrmPipelineModelDataBase.cs @@ -91,6 +91,7 @@ } else datasource = ds; + if (comboBoxExLayer.Text.Trim() == "") { MessageBox.Show("请选择一个图层文件!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning); @@ -126,20 +127,12 @@ comboBoxExLayer.Text)); if (layer == null) return; - FieldValidate fieldValidate = FieldValidateFactory.Create(ValidateConfig.LoadConfig(), - getEnumValidateType()); - - if (!fieldValidate.Validate(layer)) + if (txtModelLayer.Text != "传感设备图层") { - DateTime dt=DateTime.Now; - string logFilePath = Application.StartupPath + "\\log\\" + dt.Year + "\\" + dt.Year + dt.Month + "\\" + dt.Year + - dt.Month + dt.Day + ".txt"; - MessageBox.Show("选择的数据不符合数据规范,详情见日志" + logFilePath, "提示"); - return; + if (!getValidateResult(layer)) + return; } - ModelBuilder lineBuilder = new LineBuilder(datasource); - LineParam lineParam = new LineParam(); lineParam.layerName = txtModelLayer.Text; lineParam.uniqueIdFieldName = cmbID.Text; @@ -149,14 +142,17 @@ lineParam.diameterFieldName = cmbRadius.Text; lineParam.relativeMode = (cmbReference.Text == "管顶") ? 0 : 1; lineParam.lineColor = btnPipelineColor.BackColor; - lineParam.transparency=Convert.ToByte(ComboboxRansparency.Value); + lineParam.transparency = Convert.ToByte(ComboboxRansparency.Value); lineParam.cornerSliceAngle = Convert.ToDouble(textBoxCornerSliceAngle.Text); - lineParam.sliceNum=Convert.ToInt32(txtSlice.Text); + lineParam.sliceNum = Convert.ToInt32(txtSlice.Text); lineParam.channelWidth = comboBoxExWidth.Text; lineParam.channelHeight = comboBoxExHeight.Text; - lineBuilder.build(layer, checkBoxAdd.Checked ? EnumUpdateMode.Append : EnumUpdateMode.Update, - checkBoxDeep.Checked ? EnumBuildMode.Depth : EnumBuildMode.Alititude, lineParam); + if (txtModelLayer.Text != "传感设备图层") + lineBuilder(layer, lineParam); + else + gxLineBuilder(layer, lineParam); + addLayerToGlobeControl(lineParam.layerName); //this.DialogResult = DialogResult.OK; MessageBox.Show("入库完成!", "提示"); @@ -167,6 +163,33 @@ } } + bool getValidateResult(GSOLayer layer) + { + FieldValidate fieldValidate = FieldValidateFactory.Create(ValidateConfig.LoadConfig(), + getEnumValidateType()); + + if (fieldValidate.Validate(layer)) return true; + DateTime dt = DateTime.Now; + string logFilePath = Application.StartupPath + "\\log\\" + dt.Year + "\\" + dt.Year + dt.Month + + "\\" + dt.Year + dt.Month + dt.Day + ".txt"; + MessageBox.Show("选择的数据不符合数据规范,详情见日志" + logFilePath, "提示"); + return false; + } + + void lineBuilder(GSOLayer layer,LineParam lineParam) + { + ModelBuilder lineBuilder = new LineBuilder(datasource); + lineBuilder.build(layer, checkBoxAdd.Checked ? EnumUpdateMode.Append : EnumUpdateMode.Update, + checkBoxDeep.Checked ? EnumBuildMode.Depth : EnumBuildMode.Alititude, lineParam); + } + + void gxLineBuilder(GSOLayer layer, LineParam lineParam) + { + ModelBuilder lineBuilder = new GXBuilder(datasource); + lineBuilder.build(layer, checkBoxAdd.Checked ? EnumUpdateMode.Append : EnumUpdateMode.Update, + checkBoxDeep.Checked ? EnumBuildMode.Depth : EnumBuildMode.Alititude, lineParam); + } + private EnumValidateType getEnumValidateType() { if (comboBoxExWidth.Text != "") diff --git a/LSPipeline.csproj b/LSPipeline.csproj index 477d8ba..599b492 100644 --- a/LSPipeline.csproj +++ b/LSPipeline.csproj @@ -222,6 +222,7 @@ FrmUpdateLayerFieldValues.cs + Form @@ -243,6 +244,7 @@ + True diff --git a/FrmDatabaseParaSettingOracle.cs b/FrmDatabaseParaSettingOracle.cs index 18c5e99..6e97dfb 100644 --- a/FrmDatabaseParaSettingOracle.cs +++ b/FrmDatabaseParaSettingOracle.cs @@ -47,12 +47,15 @@ } string serverIp = textBoxIP.Text.Trim(); + /* string hostName = System.Net.Dns.GetHostName(); if (serverIp == hostName || serverIp == "localhost" || serverIp == System.Net.Dns.GetHostAddresses(hostName).GetValue(2).ToString()) { serverIp = "127.0.0.1"; } + * */ + DateTime timeStart = DateTime.Now; GSODataSource ds = globeControl1.Globe.DataManager.GetDataSourceByName(serverIp + "/" + textBoxDatabase.Text.Trim() + "_" + textBoxUser.Text.Trim()); if (ds == null) @@ -83,7 +86,7 @@ connectParams.dataSourceName = ds.Name; connectParams.databaseType = EnumDataSourceType.Oracle; Utility.connectParamsOfDatabase.Add(connectParams); - + setUtilityValue(connectParams); WriteXML(); MessageBox.Show("连接Oracle数据库成功,用时:" + secondsConnectOracle.ToString() + "秒", "提示"); } @@ -92,6 +95,14 @@ this.Close(); } + private void setUtilityValue(DatabaseConnectParams connectParams) + { + Utility.DBServer = connectParams.ip; + Utility.Database = connectParams.databaseName; + Utility.UserID = connectParams.userName; + Utility.DBPassword = connectParams.password; + } + private void ReadXML() { string strFileName = Path.GetDirectoryName(Application.ExecutablePath) + "/databaseConfigOracle.xml"; diff --git a/GXBuilder.cs b/GXBuilder.cs new file mode 100644 index 0000000..b2ec9b2 --- /dev/null +++ b/GXBuilder.cs @@ -0,0 +1,187 @@ +using System; +using System.Data; +using System.Drawing; +using System.Runtime.InteropServices; +using GeoScene.Data; +using GeoScene.Engine; +using GeoScene.Globe; + +namespace WorldGIS +{ + public class GXBuilder : ModelBuilder + { + private static double diameter = 0.1; + + public GXBuilder(GSODataSource ds) + : base(ds) + { + + } + + public override bool validate(GSOLayer layer) + { + return true; + } + + /// + /// + /// + /// 追加或修改 + /// 高程入库或埋深入库 + /// + public override bool doBuild(EnumUpdateMode updateMode, + EnumBuildMode buildMode, + BaseParam param) + { + LineParam lineParam = param as LineParam; + GSOFeatureDataset newFeatureSet = ds.GetDatasetByName(lineParam.layerName) as GSOFeatureDataset; + if (newFeatureSet == null) + { + newFeatureSet = CreateDBFeatureDataset(layer, lineParam.layerName); + } + newFeatureSet.Open(); + GSOFeatures features = layer.GetAllFeatures(true); + for (int i = 0; i < features.Length; i++) + { + GSOFeature f = features[i]; + GSOGeoPolyline3D lineeee = f.Geometry as GSOGeoPolyline3D; + if (lineeee == null || lineeee.GetSpaceLength(true, 6378137) == 0) + { + LogHelper.Error("出现数据无法入库:" + f.ID); + continue; + } + + GSOFeature newFeature = newFeatureSet.CreateFeature(); + + double radius = diameter; //创建光纤的半径 + newFeature.Geometry = updateGemotry(f, lineParam, radius, buildMode); + newFeature.Geometry.Style = getPipeLineStyle(lineParam, f, radius); + newFeature.Name = f.GetFieldAsString(lineParam.uniqueIdFieldName); + setFeatureValueByShapeFeature(f, newFeature); + // newFeatureSet + if (newFeatureSet.GetFeatureByName(newFeature.Name, true).Length > 0) + { + if (!this.UpdateGXDevice(newFeatureSet.GetFeatureByName(newFeature.Name, true)[0], + newFeature)) + { + LogHelper.Error("光纤设备更新失败:" + newFeature.Name+"\r\n"); + } + continue; + } + newFeatureSet.AddFeature(newFeature); + if (!AddGXDevice(newFeature)) + { + LogHelper.Error("光纤数据保存Alarm_Device失败:" + newFeature.Name+"\r\n"); + } + } + newFeatureSet.Save(); + newFeatureSet.Close(); + return true; + } + + private bool AddGXDevice(GSOFeature feature) + { + //保存数据到设备表 + try + { + String deviceType = feature.GetValue("DEVICETYPE") == null + ? "" : feature.GetValue("DEVICETYPE").ToString(); + String devCode = feature.GetValue("DEVICEID") == null + ? "" : feature.GetValue("DEVICEID").ToString(); + String road = feature.GetValue("ROAD") == null + ? "" : feature.GetValue("ROAD").ToString(); + + //TODO LIST: + string sqlCount = "select dbid from alarm_device_type where" + + " typename = '" + deviceType + "'"; + object dbid = OracleUtils.ExecuteScalar(OracleUtils.ConnectionString, + CommandType.Text, sqlCount); + if (dbid == null) + { + return false; + } + int deviceTypeId = int.Parse(dbid.ToString()); + string sql = "Insert into alarm_device (DBID,ACTIVE,DEVCODE,DEVNAME,FACTORY," + + "INSTALLDATE,GAOCHENG,HEIGHT,LATITUDE,LONGTITUDE,DEVICETYPE_ID) " + + "values (SEQ_DEVICE_ID.NEXTVAL, 1, '" + devCode + "', '" + deviceType + devCode + + "', " + "'航天二院', " + "to_date('" + DateTime.Now.ToString() + "','yyyy/MM/dd hh24:mi::ss'), " + + "0, 0, 0, 0, " + deviceTypeId + ")"; + OracleUtils.ExecuteNonQuery(OracleUtils.ConnectionString, CommandType.Text, sql); + + } + catch (Exception e) + { + throw; + } + return true; + } + + private bool UpdateGXDevice(GSOFeature feature, GSOFeature newFeature) + { + String deviceType = newFeature.GetValue("DEVICETYPE") == null + ? "" : newFeature.GetValue("DEVICETYPE").ToString(); + String devCode = newFeature.GetValue("DEVICEID") == null + ? "" : newFeature.GetValue("DEVICEID").ToString(); + String road = newFeature.GetValue("ROAD") == null + ? "" : newFeature.GetValue("ROAD").ToString(); + + feature.Geometry = newFeature.Geometry.Clone(); + this.setFeatureValueByShapeFeature(newFeature,feature); + // feature.Dataset.Save(); + + string sqlCount = "select dbid from alarm_device_type where" + + " typename = '" + deviceType + "'"; + object dbid = OracleUtils.ExecuteScalar(OracleUtils.ConnectionString, + CommandType.Text, sqlCount); + if (dbid == null) + { + return false; + } + int deviceTypeId = int.Parse(dbid.ToString()); + + string sql = "update alarm_device set FACTORY='" + road + + "', DEVICETYPE_ID='" + deviceTypeId + + "', DEVNAME='"+deviceType+devCode+"' "+ + "where devcode='" + devCode + "'"; + OracleUtils.ExecuteNonQuery(OracleUtils.ConnectionString, CommandType.Text, sql); + return true; + } + + private GSOLineStyle3D getPipeLineStyle(LineParam lineParam, GSOFeature f, double radius) + { + GSOPipeLineStyle3D style0 = new GSOPipeLineStyle3D(); + style0.LineColor = Color.FromArgb(lineParam.transparency, lineParam.lineColor); + style0.Slice = lineParam.sliceNum; + style0.CornerSliceAngle = lineParam.cornerSliceAngle; + style0.Radius = radius; + return style0; + } + + private GSOGeometry updateGemotry(GSOFeature f, LineParam lineParam, double radius, EnumBuildMode buildMode) + { + + f.Geometry.AltitudeMode = (buildMode.Equals(EnumBuildMode.Alititude)) ? EnumAltitudeMode.RelativeToGround : EnumAltitudeMode.Absolute; + + GSOGeoPolyline3D line = f.Geometry as GSOGeoPolyline3D; + if (line == null) + { + return null; //log4net 记录错误处理 + } + + double deep1 = 0; + double deep2 = 0; + + GSOPoint3ds pt3ds = new GSOPoint3ds(); + for (int n = 0; n < line[0].Count; n++) + { + GSOPoint3d pt3d = line[0][n]; + pt3d.Z = 0; + + pt3ds.Add(pt3d); + } + line[0] = pt3ds; + return line; + } + + } +} diff --git a/HTForms/FrmPipelineModelDataBase.cs b/HTForms/FrmPipelineModelDataBase.cs index 84a2d7b..3076bdd 100644 --- a/HTForms/FrmPipelineModelDataBase.cs +++ b/HTForms/FrmPipelineModelDataBase.cs @@ -91,6 +91,7 @@ } else datasource = ds; + if (comboBoxExLayer.Text.Trim() == "") { MessageBox.Show("请选择一个图层文件!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning); @@ -126,20 +127,12 @@ comboBoxExLayer.Text)); if (layer == null) return; - FieldValidate fieldValidate = FieldValidateFactory.Create(ValidateConfig.LoadConfig(), - getEnumValidateType()); - - if (!fieldValidate.Validate(layer)) + if (txtModelLayer.Text != "传感设备图层") { - DateTime dt=DateTime.Now; - string logFilePath = Application.StartupPath + "\\log\\" + dt.Year + "\\" + dt.Year + dt.Month + "\\" + dt.Year + - dt.Month + dt.Day + ".txt"; - MessageBox.Show("选择的数据不符合数据规范,详情见日志" + logFilePath, "提示"); - return; + if (!getValidateResult(layer)) + return; } - ModelBuilder lineBuilder = new LineBuilder(datasource); - LineParam lineParam = new LineParam(); lineParam.layerName = txtModelLayer.Text; lineParam.uniqueIdFieldName = cmbID.Text; @@ -149,14 +142,17 @@ lineParam.diameterFieldName = cmbRadius.Text; lineParam.relativeMode = (cmbReference.Text == "管顶") ? 0 : 1; lineParam.lineColor = btnPipelineColor.BackColor; - lineParam.transparency=Convert.ToByte(ComboboxRansparency.Value); + lineParam.transparency = Convert.ToByte(ComboboxRansparency.Value); lineParam.cornerSliceAngle = Convert.ToDouble(textBoxCornerSliceAngle.Text); - lineParam.sliceNum=Convert.ToInt32(txtSlice.Text); + lineParam.sliceNum = Convert.ToInt32(txtSlice.Text); lineParam.channelWidth = comboBoxExWidth.Text; lineParam.channelHeight = comboBoxExHeight.Text; - lineBuilder.build(layer, checkBoxAdd.Checked ? EnumUpdateMode.Append : EnumUpdateMode.Update, - checkBoxDeep.Checked ? EnumBuildMode.Depth : EnumBuildMode.Alititude, lineParam); + if (txtModelLayer.Text != "传感设备图层") + lineBuilder(layer, lineParam); + else + gxLineBuilder(layer, lineParam); + addLayerToGlobeControl(lineParam.layerName); //this.DialogResult = DialogResult.OK; MessageBox.Show("入库完成!", "提示"); @@ -167,6 +163,33 @@ } } + bool getValidateResult(GSOLayer layer) + { + FieldValidate fieldValidate = FieldValidateFactory.Create(ValidateConfig.LoadConfig(), + getEnumValidateType()); + + if (fieldValidate.Validate(layer)) return true; + DateTime dt = DateTime.Now; + string logFilePath = Application.StartupPath + "\\log\\" + dt.Year + "\\" + dt.Year + dt.Month + + "\\" + dt.Year + dt.Month + dt.Day + ".txt"; + MessageBox.Show("选择的数据不符合数据规范,详情见日志" + logFilePath, "提示"); + return false; + } + + void lineBuilder(GSOLayer layer,LineParam lineParam) + { + ModelBuilder lineBuilder = new LineBuilder(datasource); + lineBuilder.build(layer, checkBoxAdd.Checked ? EnumUpdateMode.Append : EnumUpdateMode.Update, + checkBoxDeep.Checked ? EnumBuildMode.Depth : EnumBuildMode.Alititude, lineParam); + } + + void gxLineBuilder(GSOLayer layer, LineParam lineParam) + { + ModelBuilder lineBuilder = new GXBuilder(datasource); + lineBuilder.build(layer, checkBoxAdd.Checked ? EnumUpdateMode.Append : EnumUpdateMode.Update, + checkBoxDeep.Checked ? EnumBuildMode.Depth : EnumBuildMode.Alititude, lineParam); + } + private EnumValidateType getEnumValidateType() { if (comboBoxExWidth.Text != "") diff --git a/LSPipeline.csproj b/LSPipeline.csproj index 477d8ba..599b492 100644 --- a/LSPipeline.csproj +++ b/LSPipeline.csproj @@ -222,6 +222,7 @@ FrmUpdateLayerFieldValues.cs + Form @@ -243,6 +244,7 @@ + True diff --git a/LSPipeline.suo b/LSPipeline.suo index c930f27..92b5d7d 100644 --- a/LSPipeline.suo +++ b/LSPipeline.suo Binary files differ diff --git a/FrmDatabaseParaSettingOracle.cs b/FrmDatabaseParaSettingOracle.cs index 18c5e99..6e97dfb 100644 --- a/FrmDatabaseParaSettingOracle.cs +++ b/FrmDatabaseParaSettingOracle.cs @@ -47,12 +47,15 @@ } string serverIp = textBoxIP.Text.Trim(); + /* string hostName = System.Net.Dns.GetHostName(); if (serverIp == hostName || serverIp == "localhost" || serverIp == System.Net.Dns.GetHostAddresses(hostName).GetValue(2).ToString()) { serverIp = "127.0.0.1"; } + * */ + DateTime timeStart = DateTime.Now; GSODataSource ds = globeControl1.Globe.DataManager.GetDataSourceByName(serverIp + "/" + textBoxDatabase.Text.Trim() + "_" + textBoxUser.Text.Trim()); if (ds == null) @@ -83,7 +86,7 @@ connectParams.dataSourceName = ds.Name; connectParams.databaseType = EnumDataSourceType.Oracle; Utility.connectParamsOfDatabase.Add(connectParams); - + setUtilityValue(connectParams); WriteXML(); MessageBox.Show("连接Oracle数据库成功,用时:" + secondsConnectOracle.ToString() + "秒", "提示"); } @@ -92,6 +95,14 @@ this.Close(); } + private void setUtilityValue(DatabaseConnectParams connectParams) + { + Utility.DBServer = connectParams.ip; + Utility.Database = connectParams.databaseName; + Utility.UserID = connectParams.userName; + Utility.DBPassword = connectParams.password; + } + private void ReadXML() { string strFileName = Path.GetDirectoryName(Application.ExecutablePath) + "/databaseConfigOracle.xml"; diff --git a/GXBuilder.cs b/GXBuilder.cs new file mode 100644 index 0000000..b2ec9b2 --- /dev/null +++ b/GXBuilder.cs @@ -0,0 +1,187 @@ +using System; +using System.Data; +using System.Drawing; +using System.Runtime.InteropServices; +using GeoScene.Data; +using GeoScene.Engine; +using GeoScene.Globe; + +namespace WorldGIS +{ + public class GXBuilder : ModelBuilder + { + private static double diameter = 0.1; + + public GXBuilder(GSODataSource ds) + : base(ds) + { + + } + + public override bool validate(GSOLayer layer) + { + return true; + } + + /// + /// + /// + /// 追加或修改 + /// 高程入库或埋深入库 + /// + public override bool doBuild(EnumUpdateMode updateMode, + EnumBuildMode buildMode, + BaseParam param) + { + LineParam lineParam = param as LineParam; + GSOFeatureDataset newFeatureSet = ds.GetDatasetByName(lineParam.layerName) as GSOFeatureDataset; + if (newFeatureSet == null) + { + newFeatureSet = CreateDBFeatureDataset(layer, lineParam.layerName); + } + newFeatureSet.Open(); + GSOFeatures features = layer.GetAllFeatures(true); + for (int i = 0; i < features.Length; i++) + { + GSOFeature f = features[i]; + GSOGeoPolyline3D lineeee = f.Geometry as GSOGeoPolyline3D; + if (lineeee == null || lineeee.GetSpaceLength(true, 6378137) == 0) + { + LogHelper.Error("出现数据无法入库:" + f.ID); + continue; + } + + GSOFeature newFeature = newFeatureSet.CreateFeature(); + + double radius = diameter; //创建光纤的半径 + newFeature.Geometry = updateGemotry(f, lineParam, radius, buildMode); + newFeature.Geometry.Style = getPipeLineStyle(lineParam, f, radius); + newFeature.Name = f.GetFieldAsString(lineParam.uniqueIdFieldName); + setFeatureValueByShapeFeature(f, newFeature); + // newFeatureSet + if (newFeatureSet.GetFeatureByName(newFeature.Name, true).Length > 0) + { + if (!this.UpdateGXDevice(newFeatureSet.GetFeatureByName(newFeature.Name, true)[0], + newFeature)) + { + LogHelper.Error("光纤设备更新失败:" + newFeature.Name+"\r\n"); + } + continue; + } + newFeatureSet.AddFeature(newFeature); + if (!AddGXDevice(newFeature)) + { + LogHelper.Error("光纤数据保存Alarm_Device失败:" + newFeature.Name+"\r\n"); + } + } + newFeatureSet.Save(); + newFeatureSet.Close(); + return true; + } + + private bool AddGXDevice(GSOFeature feature) + { + //保存数据到设备表 + try + { + String deviceType = feature.GetValue("DEVICETYPE") == null + ? "" : feature.GetValue("DEVICETYPE").ToString(); + String devCode = feature.GetValue("DEVICEID") == null + ? "" : feature.GetValue("DEVICEID").ToString(); + String road = feature.GetValue("ROAD") == null + ? "" : feature.GetValue("ROAD").ToString(); + + //TODO LIST: + string sqlCount = "select dbid from alarm_device_type where" + + " typename = '" + deviceType + "'"; + object dbid = OracleUtils.ExecuteScalar(OracleUtils.ConnectionString, + CommandType.Text, sqlCount); + if (dbid == null) + { + return false; + } + int deviceTypeId = int.Parse(dbid.ToString()); + string sql = "Insert into alarm_device (DBID,ACTIVE,DEVCODE,DEVNAME,FACTORY," + + "INSTALLDATE,GAOCHENG,HEIGHT,LATITUDE,LONGTITUDE,DEVICETYPE_ID) " + + "values (SEQ_DEVICE_ID.NEXTVAL, 1, '" + devCode + "', '" + deviceType + devCode + + "', " + "'航天二院', " + "to_date('" + DateTime.Now.ToString() + "','yyyy/MM/dd hh24:mi::ss'), " + + "0, 0, 0, 0, " + deviceTypeId + ")"; + OracleUtils.ExecuteNonQuery(OracleUtils.ConnectionString, CommandType.Text, sql); + + } + catch (Exception e) + { + throw; + } + return true; + } + + private bool UpdateGXDevice(GSOFeature feature, GSOFeature newFeature) + { + String deviceType = newFeature.GetValue("DEVICETYPE") == null + ? "" : newFeature.GetValue("DEVICETYPE").ToString(); + String devCode = newFeature.GetValue("DEVICEID") == null + ? "" : newFeature.GetValue("DEVICEID").ToString(); + String road = newFeature.GetValue("ROAD") == null + ? "" : newFeature.GetValue("ROAD").ToString(); + + feature.Geometry = newFeature.Geometry.Clone(); + this.setFeatureValueByShapeFeature(newFeature,feature); + // feature.Dataset.Save(); + + string sqlCount = "select dbid from alarm_device_type where" + + " typename = '" + deviceType + "'"; + object dbid = OracleUtils.ExecuteScalar(OracleUtils.ConnectionString, + CommandType.Text, sqlCount); + if (dbid == null) + { + return false; + } + int deviceTypeId = int.Parse(dbid.ToString()); + + string sql = "update alarm_device set FACTORY='" + road + + "', DEVICETYPE_ID='" + deviceTypeId + + "', DEVNAME='"+deviceType+devCode+"' "+ + "where devcode='" + devCode + "'"; + OracleUtils.ExecuteNonQuery(OracleUtils.ConnectionString, CommandType.Text, sql); + return true; + } + + private GSOLineStyle3D getPipeLineStyle(LineParam lineParam, GSOFeature f, double radius) + { + GSOPipeLineStyle3D style0 = new GSOPipeLineStyle3D(); + style0.LineColor = Color.FromArgb(lineParam.transparency, lineParam.lineColor); + style0.Slice = lineParam.sliceNum; + style0.CornerSliceAngle = lineParam.cornerSliceAngle; + style0.Radius = radius; + return style0; + } + + private GSOGeometry updateGemotry(GSOFeature f, LineParam lineParam, double radius, EnumBuildMode buildMode) + { + + f.Geometry.AltitudeMode = (buildMode.Equals(EnumBuildMode.Alititude)) ? EnumAltitudeMode.RelativeToGround : EnumAltitudeMode.Absolute; + + GSOGeoPolyline3D line = f.Geometry as GSOGeoPolyline3D; + if (line == null) + { + return null; //log4net 记录错误处理 + } + + double deep1 = 0; + double deep2 = 0; + + GSOPoint3ds pt3ds = new GSOPoint3ds(); + for (int n = 0; n < line[0].Count; n++) + { + GSOPoint3d pt3d = line[0][n]; + pt3d.Z = 0; + + pt3ds.Add(pt3d); + } + line[0] = pt3ds; + return line; + } + + } +} diff --git a/HTForms/FrmPipelineModelDataBase.cs b/HTForms/FrmPipelineModelDataBase.cs index 84a2d7b..3076bdd 100644 --- a/HTForms/FrmPipelineModelDataBase.cs +++ b/HTForms/FrmPipelineModelDataBase.cs @@ -91,6 +91,7 @@ } else datasource = ds; + if (comboBoxExLayer.Text.Trim() == "") { MessageBox.Show("请选择一个图层文件!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning); @@ -126,20 +127,12 @@ comboBoxExLayer.Text)); if (layer == null) return; - FieldValidate fieldValidate = FieldValidateFactory.Create(ValidateConfig.LoadConfig(), - getEnumValidateType()); - - if (!fieldValidate.Validate(layer)) + if (txtModelLayer.Text != "传感设备图层") { - DateTime dt=DateTime.Now; - string logFilePath = Application.StartupPath + "\\log\\" + dt.Year + "\\" + dt.Year + dt.Month + "\\" + dt.Year + - dt.Month + dt.Day + ".txt"; - MessageBox.Show("选择的数据不符合数据规范,详情见日志" + logFilePath, "提示"); - return; + if (!getValidateResult(layer)) + return; } - ModelBuilder lineBuilder = new LineBuilder(datasource); - LineParam lineParam = new LineParam(); lineParam.layerName = txtModelLayer.Text; lineParam.uniqueIdFieldName = cmbID.Text; @@ -149,14 +142,17 @@ lineParam.diameterFieldName = cmbRadius.Text; lineParam.relativeMode = (cmbReference.Text == "管顶") ? 0 : 1; lineParam.lineColor = btnPipelineColor.BackColor; - lineParam.transparency=Convert.ToByte(ComboboxRansparency.Value); + lineParam.transparency = Convert.ToByte(ComboboxRansparency.Value); lineParam.cornerSliceAngle = Convert.ToDouble(textBoxCornerSliceAngle.Text); - lineParam.sliceNum=Convert.ToInt32(txtSlice.Text); + lineParam.sliceNum = Convert.ToInt32(txtSlice.Text); lineParam.channelWidth = comboBoxExWidth.Text; lineParam.channelHeight = comboBoxExHeight.Text; - lineBuilder.build(layer, checkBoxAdd.Checked ? EnumUpdateMode.Append : EnumUpdateMode.Update, - checkBoxDeep.Checked ? EnumBuildMode.Depth : EnumBuildMode.Alititude, lineParam); + if (txtModelLayer.Text != "传感设备图层") + lineBuilder(layer, lineParam); + else + gxLineBuilder(layer, lineParam); + addLayerToGlobeControl(lineParam.layerName); //this.DialogResult = DialogResult.OK; MessageBox.Show("入库完成!", "提示"); @@ -167,6 +163,33 @@ } } + bool getValidateResult(GSOLayer layer) + { + FieldValidate fieldValidate = FieldValidateFactory.Create(ValidateConfig.LoadConfig(), + getEnumValidateType()); + + if (fieldValidate.Validate(layer)) return true; + DateTime dt = DateTime.Now; + string logFilePath = Application.StartupPath + "\\log\\" + dt.Year + "\\" + dt.Year + dt.Month + + "\\" + dt.Year + dt.Month + dt.Day + ".txt"; + MessageBox.Show("选择的数据不符合数据规范,详情见日志" + logFilePath, "提示"); + return false; + } + + void lineBuilder(GSOLayer layer,LineParam lineParam) + { + ModelBuilder lineBuilder = new LineBuilder(datasource); + lineBuilder.build(layer, checkBoxAdd.Checked ? EnumUpdateMode.Append : EnumUpdateMode.Update, + checkBoxDeep.Checked ? EnumBuildMode.Depth : EnumBuildMode.Alititude, lineParam); + } + + void gxLineBuilder(GSOLayer layer, LineParam lineParam) + { + ModelBuilder lineBuilder = new GXBuilder(datasource); + lineBuilder.build(layer, checkBoxAdd.Checked ? EnumUpdateMode.Append : EnumUpdateMode.Update, + checkBoxDeep.Checked ? EnumBuildMode.Depth : EnumBuildMode.Alititude, lineParam); + } + private EnumValidateType getEnumValidateType() { if (comboBoxExWidth.Text != "") diff --git a/LSPipeline.csproj b/LSPipeline.csproj index 477d8ba..599b492 100644 --- a/LSPipeline.csproj +++ b/LSPipeline.csproj @@ -222,6 +222,7 @@ FrmUpdateLayerFieldValues.cs + Form @@ -243,6 +244,7 @@ + True diff --git a/LSPipeline.suo b/LSPipeline.suo index c930f27..92b5d7d 100644 --- a/LSPipeline.suo +++ b/LSPipeline.suo Binary files differ diff --git a/OracleUtils.cs b/OracleUtils.cs new file mode 100644 index 0000000..c79d316 --- /dev/null +++ b/OracleUtils.cs @@ -0,0 +1,1271 @@ +using System; +using System.Collections; +using System.Data; +using System.Data.OracleClient; + +namespace WorldGIS +{ + public abstract class OracleUtils + { + // Read the connection strings from the configuration file + //public static readonly string ConnectionString = System.Configuration.ConfigurationSettings.AppSettings["ConnectionString"]; + public static readonly string ConnectionString = @"Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=" + Utility.DBServer + + ")(PORT=1521))(CONNECT_DATA=(SID=" + Utility.Database + + ")));Persist Security Info=True;User Id=" + Utility.UserID + + "; Password=" + Utility.DBPassword + ""; + + //Create a hashtable for the parameter cached + private static Hashtable parmCache = Hashtable.Synchronized(new Hashtable()); + + #region private utility methods & constructors + + //Since this class provides only static methods, make the default constructor private to prevent + //instances from being created with "new SqlHelper()". + private OracleUtils() { } + + /// + /// This method is used to attach array of SqlParameters to a SqlCommand. + /// + /// This method will assign a value of DbNull to any parameter with a direction of + /// InputOutput and a value of null. + /// + /// This behavior will prevent default values from being used, but + /// this will be the less common case than an intended pure output parameter (derived as InputOutput) + /// where the user provided no input value. + /// + /// The command to which the parameters will be added + /// an array of SqlParameters tho be added to command + private static void AttachParameters(OracleCommand command, OracleParameter[] commandParameters) + { + foreach (OracleParameter p in commandParameters) + { + //check for derived output value with no value assigned + if ((p.Direction == ParameterDirection.InputOutput) && (p.Value == null)) + { + p.Value = DBNull.Value; + } + + command.Parameters.Add(p); + } + } + + /// + /// This method assigns an array of values to an array of SqlParameters. + /// + /// array of SqlParameters to be assigned values + /// array of objects holding the values to be assigned + private static void AssignParameterValues(OracleParameter[] commandParameters, object[] parameterValues) + { + if ((commandParameters == null) || (parameterValues == null)) + { + //do nothing if we get no data + return; + } + + // we must have the same number of values as we pave parameters to put them in + if (commandParameters.Length != parameterValues.Length) + { + throw new ArgumentException("Parameter count does not match Parameter Value count."); + } + + //iterate through the SqlParameters, assigning the values from the corresponding position in the + //value array + for (int i = 0, j = commandParameters.Length; i < j; i++) + { + commandParameters[i].Value = parameterValues[i]; + } + } + + /// + /// This method opens (if necessary) and assigns a connection, transaction, command type and parameters + /// to the provided command. + /// + /// the SqlCommand to be prepared + /// a valid OracleConnection, on which to execute this command + /// a valid OracleTransaction, or 'null' + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an array of SqlParameters to be associated with the command or 'null' if no parameters are required + private static void PrepareCommand(OracleCommand command, OracleConnection connection, OracleTransaction transaction, CommandType commandType, string commandText, OracleParameter[] commandParameters) + { + //if the provided connection is not open, we will open it + if (connection.State != ConnectionState.Open) + { + connection.Open(); + } + + //associate the connection with the command + command.Connection = connection; + + //set the command text (stored procedure name or SQL statement) + command.CommandText = commandText; + + //if we were provided a transaction, assign it. + if (transaction != null) + { + command.Transaction = transaction; + } + + //set the command type + command.CommandType = commandType; + + //attach the command parameters if they are provided + if (commandParameters != null) + { + AttachParameters(command, commandParameters); + } + } + + + #endregion private utility methods & constructors + + #region ExecuteNonQuery + + /// + /// Execute a SqlCommand (that returns no resultset and takes no parameters) against the database specified in + /// the connection string. + /// + /// + /// e.g.: + /// int result = ExecuteNonQuery(connString, CommandType.StoredProcedure, "PublishOrders"); + /// + /// a valid connection string for a OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an int representing the number of rows affected by the command + public static int ExecuteNonQuery(string connectionString, CommandType commandType, string commandText) + { + //pass through the call providing null for the set of SqlParameters + return ExecuteNonQuery(connectionString, commandType, commandText, null); + } + + /// + /// Execute a SqlCommand (that returns no resultset) against the database specified in the connection string + /// using the provided parameters. + /// + /// + /// e.g.: + /// int result = ExecuteNonQuery(connString, CommandType.StoredProcedure, "PublishOrders", new OracleParameter("@prodid", 24)); + /// + /// a valid connection string for a OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an array of SqlParamters used to execute the command + /// an int representing the number of rows affected by the command + public static int ExecuteNonQuery(string connectionString, CommandType commandType, string commandText, params OracleParameter[] commandParameters) + { + //create & open a OracleConnection, and dispose of it after we are done. + using (OracleConnection cn = new OracleConnection(connectionString)) + { + cn.Open(); + + //call the overload that takes a connection in place of the connection string + return ExecuteNonQuery(cn, commandType, commandText, commandParameters); + } + } + + /// + /// Execute a stored procedure via a SqlCommand (that returns no resultset) against the database specified in + /// the connection string using the provided parameter values. This method will query the database to discover the parameters for the + /// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. + /// + /// + /// This method provides no access to output parameters or the stored procedure's return value parameter. + /// + /// e.g.: + /// int result = ExecuteNonQuery(connString, "PublishOrders", 24, 36); + /// + /// a valid connection string for a OracleConnection + /// the name of the stored prcedure + /// an array of objects to be assigned as the input values of the stored procedure + /// an int representing the number of rows affected by the command + public static int ExecuteNonQuery(string connectionString, string spName, params object[] parameterValues) + { + //if we receive parameter values, we need to figure out where they go + if ((parameterValues != null) && (parameterValues.Length > 0)) + { + //pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache) + OracleParameter[] commandParameters = OracleHelperParameterCache.GetSpParameterSet(connectionString, spName); + + //assign the provided values to these parameters based on parameter order + AssignParameterValues(commandParameters, parameterValues); + + //call the overload that takes an array of SqlParameters + return ExecuteNonQuery(connectionString, CommandType.StoredProcedure, spName, commandParameters); + } + //otherwise we can just call the SP without params + return ExecuteNonQuery(connectionString, CommandType.StoredProcedure, spName); + } + + /// + /// Execute a SqlCommand (that returns no resultset and takes no parameters) against the provided OracleConnection. + /// + /// + /// e.g.: + /// int result = ExecuteNonQuery(conn, CommandType.StoredProcedure, "PublishOrders"); + /// + /// a valid OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an int representing the number of rows affected by the command + public static int ExecuteNonQuery(OracleConnection connection, CommandType commandType, string commandText) + { + //pass through the call providing null for the set of SqlParameters + return ExecuteNonQuery(connection, commandType, commandText, null); + } + + /// + /// Execute a SqlCommand (that returns no resultset) against the specified OracleConnection + /// using the provided parameters. + /// + /// + /// e.g.: + /// int result = ExecuteNonQuery(conn, CommandType.StoredProcedure, "PublishOrders", new OracleParameter("@prodid", 24)); + /// + /// a valid OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an array of SqlParamters used to execute the command + /// an int representing the number of rows affected by the command + public static int ExecuteNonQuery(OracleConnection connection, CommandType commandType, string commandText, params OracleParameter[] commandParameters) + { + //create a command and prepare it for execution + + OracleCommand cmd = new OracleCommand(); + PrepareCommand(cmd, connection, null, commandType, commandText, commandParameters); + + //finally, execute the command. + int retval = cmd.ExecuteNonQuery(); + + // detach the SqlParameters from the command object, so they can be used again. + cmd.Parameters.Clear(); + return retval; + } + + public static int ExecuteNonQueryWithTimeout(string connectionString, CommandType commandType, string commandText, int cmdTimeout) + { + //create a command and prepare it for execution + using (OracleConnection cn = new OracleConnection(connectionString)) + { + cn.Open(); + OracleCommand cmd = new OracleCommand(); + PrepareCommand(cmd, cn, null, commandType, commandText, null); + cmd.CommandTimeout = cmdTimeout; + //finally, execute the command. + int retval = cmd.ExecuteNonQuery(); + + // detach the SqlParameters from the command object, so they can be used again. + cmd.Parameters.Clear(); + return retval; + } + + } + /// + /// Execute a stored procedure via a SqlCommand (that returns no resultset) against the specified OracleConnection + /// using the provided parameter values. This method will query the database to discover the parameters for the + /// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. + /// + /// + /// This method provides no access to output parameters or the stored procedure's return value parameter. + /// + /// e.g.: + /// int result = ExecuteNonQuery(conn, "PublishOrders", 24, 36); + /// + /// a valid OracleConnection + /// the name of the stored procedure + /// an array of objects to be assigned as the input values of the stored procedure + /// an int representing the number of rows affected by the command + public static int ExecuteNonQuery(OracleConnection connection, string spName, params object[] parameterValues) + { + //if we receive parameter values, we need to figure out where they go + if ((parameterValues != null) && (parameterValues.Length > 0)) + { + //pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache) + OracleParameter[] commandParameters = OracleHelperParameterCache.GetSpParameterSet(connection.ConnectionString, spName); + + //assign the provided values to these parameters based on parameter order + AssignParameterValues(commandParameters, parameterValues); + + //call the overload that takes an array of SqlParameters + return ExecuteNonQuery(connection, CommandType.StoredProcedure, spName, commandParameters); + } + //otherwise we can just call the SP without params + return ExecuteNonQuery(connection, CommandType.StoredProcedure, spName); + } + + /// + /// Execute a SqlCommand (that returns no resultset and takes no parameters) against the provided OracleTransaction. + /// + /// + /// e.g.: + /// int result = ExecuteNonQuery(trans, CommandType.StoredProcedure, "PublishOrders"); + /// + /// a valid OracleTransaction + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an int representing the number of rows affected by the command + public static int ExecuteNonQuery(OracleTransaction transaction, CommandType commandType, string commandText) + { + //pass through the call providing null for the set of SqlParameters + return ExecuteNonQuery(transaction, commandType, commandText, null); + } + + /// + /// Execute a SqlCommand (that returns no resultset) against the specified OracleTransaction + /// using the provided parameters. + /// + /// + /// e.g.: + /// int result = ExecuteNonQuery(trans, CommandType.StoredProcedure, "GetOrders", new OracleParameter("@prodid", 24)); + /// + /// a valid OracleTransaction + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an array of SqlParamters used to execute the command + /// an int representing the number of rows affected by the command + public static int ExecuteNonQuery(OracleTransaction transaction, CommandType commandType, string commandText, params OracleParameter[] commandParameters) + { + //create a command and prepare it for execution + OracleCommand cmd = new OracleCommand(); + PrepareCommand(cmd, transaction.Connection, transaction, commandType, commandText, commandParameters); + + //finally, execute the command. + int retval = cmd.ExecuteNonQuery(); + + // detach the SqlParameters from the command object, so they can be used again. + cmd.Parameters.Clear(); + return retval; + } + + /// + /// Execute a stored procedure via a SqlCommand (that returns no resultset) against the specified + /// OracleTransaction using the provided parameter values. This method will query the database to discover the parameters for the + /// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. + /// + /// + /// This method provides no access to output parameters or the stored procedure's return value parameter. + /// + /// e.g.: + /// int result = ExecuteNonQuery(conn, trans, "PublishOrders", 24, 36); + /// + /// a valid OracleTransaction + /// the name of the stored procedure + /// an array of objects to be assigned as the input values of the stored procedure + /// an int representing the number of rows affected by the command + public static int ExecuteNonQuery(OracleTransaction transaction, string spName, params object[] parameterValues) + { + //if we receive parameter values, we need to figure out where they go + if ((parameterValues != null) && (parameterValues.Length > 0)) + { + //pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache) + OracleParameter[] commandParameters = OracleHelperParameterCache.GetSpParameterSet(transaction.Connection.ConnectionString, spName); + + //assign the provided values to these parameters based on parameter order + AssignParameterValues(commandParameters, parameterValues); + + //call the overload that takes an array of SqlParameters + return ExecuteNonQuery(transaction, CommandType.StoredProcedure, spName, commandParameters); + } + //otherwise we can just call the SP without params + return ExecuteNonQuery(transaction, CommandType.StoredProcedure, spName); + } + + + #endregion ExecuteNonQuery + + #region ExecuteDataSet + + /// + /// Execute a SqlCommand (that returns a resultset and takes no parameters) against the database specified in + /// the connection string. + /// + /// + /// e.g.: + /// DataSet ds = ExecuteDataset(connString, CommandType.StoredProcedure, "GetOrders"); + /// + /// a valid connection string for a OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// a dataset containing the resultset generated by the command + public static DataSet ExecuteDataset(string connectionString, CommandType commandType, string commandText) + { + //pass through the call providing null for the set of SqlParameters + return ExecuteDataset(connectionString, commandType, commandText, null); + } + + /// + /// Execute a SqlCommand (that returns a resultset) against the database specified in the connection string + /// using the provided parameters. + /// + /// + /// e.g.: + /// DataSet ds = ExecuteDataset(connString, CommandType.StoredProcedure, "GetOrders", new OracleParameter("@prodid", 24)); + /// + /// a valid connection string for a OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an array of SqlParamters used to execute the command + /// a dataset containing the resultset generated by the command + public static DataSet ExecuteDataset(string connectionString, CommandType commandType, string commandText, params OracleParameter[] commandParameters) + { + //create & open a OracleConnection, and dispose of it after we are done. + using (OracleConnection cn = new OracleConnection(connectionString)) + { + cn.Open(); + + //call the overload that takes a connection in place of the connection string + return ExecuteDataset(cn, commandType, commandText, commandParameters); + } + } + + /// + /// Execute a stored procedure via a SqlCommand (that returns a resultset) against the database specified in + /// the connection string using the provided parameter values. This method will query the database to discover the parameters for the + /// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. + /// + /// + /// This method provides no access to output parameters or the stored procedure's return value parameter. + /// + /// e.g.: + /// DataSet ds = ExecuteDataset(connString, "GetOrders", 24, 36); + /// + /// a valid connection string for a OracleConnection + /// the name of the stored procedure + /// an array of objects to be assigned as the input values of the stored procedure + /// a dataset containing the resultset generated by the command + public static DataSet ExecuteDataset(string connectionString, string spName, params object[] parameterValues) + { + //if we receive parameter values, we need to figure out where they go + if ((parameterValues != null) && (parameterValues.Length > 0)) + { + //pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache) + OracleParameter[] commandParameters = OracleHelperParameterCache.GetSpParameterSet(connectionString, spName); + + //assign the provided values to these parameters based on parameter order + AssignParameterValues(commandParameters, parameterValues); + + //call the overload that takes an array of SqlParameters + return ExecuteDataset(connectionString, CommandType.StoredProcedure, spName, commandParameters); + } + //otherwise we can just call the SP without params + return ExecuteDataset(connectionString, CommandType.StoredProcedure, spName); + } + + /// + /// Execute a SqlCommand (that returns a resultset and takes no parameters) against the provided OracleConnection. + /// + /// + /// e.g.: + /// DataSet ds = ExecuteDataset(conn, CommandType.StoredProcedure, "GetOrders"); + /// + /// a valid OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// a dataset containing the resultset generated by the command + public static DataSet ExecuteDataset(OracleConnection connection, CommandType commandType, string commandText) + { + //pass through the call providing null for the set of SqlParameters + return ExecuteDataset(connection, commandType, commandText, null); + } + + /// + /// Execute a SqlCommand (that returns a resultset) against the specified OracleConnection + /// using the provided parameters. + /// + /// + /// e.g.: + /// DataSet ds = ExecuteDataset(conn, CommandType.StoredProcedure, "GetOrders", new OracleParameter("@prodid", 24)); + /// + /// a valid OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an array of SqlParamters used to execute the command + /// a dataset containing the resultset generated by the command + public static DataSet ExecuteDataset(OracleConnection connection, CommandType commandType, string commandText, params OracleParameter[] commandParameters) + { + //create a command and prepare it for execution + OracleCommand cmd = new OracleCommand(); + PrepareCommand(cmd, connection, null, commandType, commandText, commandParameters); + + //create the DataAdapter & DataSet + OracleDataAdapter da = new OracleDataAdapter(cmd); + DataSet ds = new DataSet(); + + //fill the DataSet using default values for DataTable names, etc. + da.Fill(ds); + + // detach the SqlParameters from the command object, so they can be used again. + cmd.Parameters.Clear(); + + //return the dataset + return ds; + } + + /// + /// Execute a stored procedure via a SqlCommand (that returns a resultset) against the specified OracleConnection + /// using the provided parameter values. This method will query the database to discover the parameters for the + /// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. + /// + /// + /// This method provides no access to output parameters or the stored procedure's return value parameter. + /// + /// e.g.: + /// DataSet ds = ExecuteDataset(conn, "GetOrders", 24, 36); + /// + /// a valid OracleConnection + /// the name of the stored procedure + /// an array of objects to be assigned as the input values of the stored procedure + /// a dataset containing the resultset generated by the command + public static DataSet ExecuteDataset(OracleConnection connection, string spName, params object[] parameterValues) + { + //if we receive parameter values, we need to figure out where they go + if ((parameterValues != null) && (parameterValues.Length > 0)) + { + //pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache) + OracleParameter[] commandParameters = OracleHelperParameterCache.GetSpParameterSet(connection.ConnectionString, spName); + + //assign the provided values to these parameters based on parameter order + AssignParameterValues(commandParameters, parameterValues); + + //call the overload that takes an array of SqlParameters + return ExecuteDataset(connection, CommandType.StoredProcedure, spName, commandParameters); + } + //otherwise we can just call the SP without params + return ExecuteDataset(connection, CommandType.StoredProcedure, spName); + } + + /// + /// Execute a SqlCommand (that returns a resultset and takes no parameters) against the provided OracleTransaction. + /// + /// + /// e.g.: + /// DataSet ds = ExecuteDataset(trans, CommandType.StoredProcedure, "GetOrders"); + /// + /// a valid OracleTransaction + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// a dataset containing the resultset generated by the command + public static DataSet ExecuteDataset(OracleTransaction transaction, CommandType commandType, string commandText) + { + //pass through the call providing null for the set of SqlParameters + return ExecuteDataset(transaction, commandType, commandText, null); + } + + /// + /// Execute a SqlCommand (that returns a resultset) against the specified OracleTransaction + /// using the provided parameters. + /// + /// + /// e.g.: + /// DataSet ds = ExecuteDataset(trans, CommandType.StoredProcedure, "GetOrders", new OracleParameter("@prodid", 24)); + /// + /// a valid OracleTransaction + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an array of SqlParamters used to execute the command + /// a dataset containing the resultset generated by the command + public static DataSet ExecuteDataset(OracleTransaction transaction, CommandType commandType, string commandText, params OracleParameter[] commandParameters) + { + //create a command and prepare it for execution + OracleCommand cmd = new OracleCommand(); + PrepareCommand(cmd, transaction.Connection, transaction, commandType, commandText, commandParameters); + + //create the DataAdapter & DataSet + OracleDataAdapter da = new OracleDataAdapter(cmd); + DataSet ds = new DataSet(); + + //fill the DataSet using default values for DataTable names, etc. + da.Fill(ds); + + // detach the SqlParameters from the command object, so they can be used again. + cmd.Parameters.Clear(); + + //return the dataset + return ds; + } + + /// + /// Execute a stored procedure via a SqlCommand (that returns a resultset) against the specified + /// OracleTransaction using the provided parameter values. This method will query the database to discover the parameters for the + /// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. + /// + /// + /// This method provides no access to output parameters or the stored procedure's return value parameter. + /// + /// e.g.: + /// DataSet ds = ExecuteDataset(trans, "GetOrders", 24, 36); + /// + /// a valid OracleTransaction + /// the name of the stored procedure + /// an array of objects to be assigned as the input values of the stored procedure + /// a dataset containing the resultset generated by the command + public static DataSet ExecuteDataset(OracleTransaction transaction, string spName, params object[] parameterValues) + { + //if we receive parameter values, we need to figure out where they go + if ((parameterValues != null) && (parameterValues.Length > 0)) + { + //pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache) + OracleParameter[] commandParameters = OracleHelperParameterCache.GetSpParameterSet(transaction.Connection.ConnectionString, spName); + + //assign the provided values to these parameters based on parameter order + AssignParameterValues(commandParameters, parameterValues); + + //call the overload that takes an array of SqlParameters + return ExecuteDataset(transaction, CommandType.StoredProcedure, spName, commandParameters); + } + //otherwise we can just call the SP without params + return ExecuteDataset(transaction, CommandType.StoredProcedure, spName); + } + + #endregion ExecuteDataSet + + #region ExecuteReader + + /// + /// this enum is used to indicate whether the connection was provided by the caller, or created by SqlHelper, so that + /// we can set the appropriate CommandBehavior when calling ExecuteReader() + /// + private enum OracleConnectionOwnership + { + /// Connection is owned and managed by SqlHelper + Internal, + /// Connection is owned and managed by the caller + External + } + + /// + /// Create and prepare a SqlCommand, and call ExecuteReader with the appropriate CommandBehavior. + /// + /// + /// If we created and opened the connection, we want the connection to be closed when the DataReader is closed. + /// + /// If the caller provided the connection, we want to leave it to them to manage. + /// + /// a valid OracleConnection, on which to execute this command + /// a valid OracleTransaction, or 'null' + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an array of SqlParameters to be associated with the command or 'null' if no parameters are required + /// indicates whether the connection parameter was provided by the caller, or created by SqlHelper + /// SqlDataReader containing the results of the command + private static OracleDataReader ExecuteReader(OracleConnection connection, OracleTransaction transaction, CommandType commandType, string commandText, OracleParameter[] commandParameters, OracleConnectionOwnership connectionOwnership) + { + //create a command and prepare it for execution + OracleCommand cmd = new OracleCommand(); + PrepareCommand(cmd, connection, transaction, commandType, commandText, commandParameters); + + //create a reader + OracleDataReader dr; + + // call ExecuteReader with the appropriate CommandBehavior + if (connectionOwnership == OracleConnectionOwnership.External) + { + dr = cmd.ExecuteReader(); + } + else + { + dr = cmd.ExecuteReader(CommandBehavior.CloseConnection); + + } + + // detach the SqlParameters from the command object, so they can be used again. + cmd.Parameters.Clear(); + + return dr; + } + + /// + /// Execute a SqlCommand (that returns a resultset and takes no parameters) against the database specified in + /// the connection string. + /// + /// + /// e.g.: + /// SqlDataReader dr = ExecuteReader(connString, CommandType.StoredProcedure, "GetOrders"); + /// + /// a valid connection string for a OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// a SqlDataReader containing the resultset generated by the command + public static OracleDataReader ExecuteReader(string connectionString, CommandType commandType, string commandText) + { + //pass through the call providing null for the set of SqlParameters + return ExecuteReader(connectionString, commandType, commandText, null); + } + + /// + /// Execute a SqlCommand (that returns a resultset) against the database specified in the connection string + /// using the provided parameters. + /// + /// + /// e.g.: + /// SqlDataReader dr = ExecuteReader(connString, CommandType.StoredProcedure, "GetOrders", new OracleParameter("@prodid", 24)); + /// + /// a valid connection string for a OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an array of SqlParamters used to execute the command + /// a SqlDataReader containing the resultset generated by the command + public static OracleDataReader ExecuteReader(string connectionString, CommandType commandType, string commandText, params OracleParameter[] commandParameters) + { + //create & open a OracleConnection + OracleConnection cn = new OracleConnection(connectionString); + cn.Open(); + + try + { + //call the private overload that takes an internally owned connection in place of the connection string + return ExecuteReader(cn, null, commandType, commandText, commandParameters, OracleConnectionOwnership.Internal); + } + catch + { + //if we fail to return the SqlDatReader, we need to close the connection ourselves + cn.Close(); + throw; + } + } + + /// + /// Execute a stored procedure via a SqlCommand (that returns a resultset) against the database specified in + /// the connection string using the provided parameter values. This method will query the database to discover the parameters for the + /// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. + /// + /// + /// This method provides no access to output parameters or the stored procedure's return value parameter. + /// + /// e.g.: + /// SqlDataReader dr = ExecuteReader(connString, "GetOrders", 24, 36); + /// + /// a valid connection string for a OracleConnection + /// the name of the stored procedure + /// an array of objects to be assigned as the input values of the stored procedure + /// a SqlDataReader containing the resultset generated by the command + public static OracleDataReader ExecuteReader(string connectionString, string spName, params object[] parameterValues) + { + //if we receive parameter values, we need to figure out where they go + if ((parameterValues != null) && (parameterValues.Length > 0)) + { + //pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache) + OracleParameter[] commandParameters = OracleHelperParameterCache.GetSpParameterSet(connectionString, spName); + + //assign the provided values to these parameters based on parameter order + AssignParameterValues(commandParameters, parameterValues); + + //call the overload that takes an array of SqlParameters + return ExecuteReader(connectionString, CommandType.StoredProcedure, spName, commandParameters); + } + //otherwise we can just call the SP without params + return ExecuteReader(connectionString, CommandType.StoredProcedure, spName); + } + + /// + /// Execute a SqlCommand (that returns a resultset and takes no parameters) against the provided OracleConnection. + /// + /// + /// e.g.: + /// SqlDataReader dr = ExecuteReader(conn, CommandType.StoredProcedure, "GetOrders"); + /// + /// a valid OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// a SqlDataReader containing the resultset generated by the command + public static OracleDataReader ExecuteReader(OracleConnection connection, CommandType commandType, string commandText) + { + //pass through the call providing null for the set of SqlParameters + return ExecuteReader(connection, commandType, commandText, null); + } + + /// + /// Execute a SqlCommand (that returns a resultset) against the specified OracleConnection + /// using the provided parameters. + /// + /// + /// e.g.: + /// SqlDataReader dr = ExecuteReader(conn, CommandType.StoredProcedure, "GetOrders", new OracleParameter("@prodid", 24)); + /// + /// a valid OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an array of SqlParamters used to execute the command + /// a SqlDataReader containing the resultset generated by the command + public static OracleDataReader ExecuteReader(OracleConnection connection, CommandType commandType, string commandText, params OracleParameter[] commandParameters) + { + //pass through the call to the private overload using a null transaction value and an externally owned connection + return ExecuteReader(connection, null, commandType, commandText, commandParameters, OracleConnectionOwnership.External); + } + + /// + /// Execute a stored procedure via a SqlCommand (that returns a resultset) against the specified OracleConnection + /// using the provided parameter values. This method will query the database to discover the parameters for the + /// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. + /// + /// + /// This method provides no access to output parameters or the stored procedure's return value parameter. + /// + /// e.g.: + /// SqlDataReader dr = ExecuteReader(conn, "GetOrders", 24, 36); + /// + /// a valid OracleConnection + /// the name of the stored procedure + /// an array of objects to be assigned as the input values of the stored procedure + /// a SqlDataReader containing the resultset generated by the command + public static OracleDataReader ExecuteReader(OracleConnection connection, string spName, params object[] parameterValues) + { + //if we receive parameter values, we need to figure out where they go + if ((parameterValues != null) && (parameterValues.Length > 0)) + { + OracleParameter[] commandParameters = OracleHelperParameterCache.GetSpParameterSet(connection.ConnectionString, spName); + + AssignParameterValues(commandParameters, parameterValues); + + return ExecuteReader(connection, CommandType.StoredProcedure, spName, commandParameters); + } + //otherwise we can just call the SP without params + return ExecuteReader(connection, CommandType.StoredProcedure, spName); + } + + /// + /// Execute a SqlCommand (that returns a resultset and takes no parameters) against the provided OracleTransaction. + /// + /// + /// e.g.: + /// SqlDataReader dr = ExecuteReader(trans, CommandType.StoredProcedure, "GetOrders"); + /// + /// a valid OracleTransaction + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// a SqlDataReader containing the resultset generated by the command + public static OracleDataReader ExecuteReader(OracleTransaction transaction, CommandType commandType, string commandText) + { + //pass through the call providing null for the set of SqlParameters + return ExecuteReader(transaction, commandType, commandText, null); + } + + /// + /// Execute a SqlCommand (that returns a resultset) against the specified OracleTransaction + /// using the provided parameters. + /// + /// + /// e.g.: + /// SqlDataReader dr = ExecuteReader(trans, CommandType.StoredProcedure, "GetOrders", new OracleParameter("@prodid", 24)); + /// + /// a valid OracleTransaction + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an array of SqlParamters used to execute the command + /// a SqlDataReader containing the resultset generated by the command + public static OracleDataReader ExecuteReader(OracleTransaction transaction, CommandType commandType, string commandText, params OracleParameter[] commandParameters) + { + //pass through to private overload, indicating that the connection is owned by the caller + return ExecuteReader(transaction.Connection, transaction, commandType, commandText, commandParameters, OracleConnectionOwnership.External); + } + + /// + /// Execute a stored procedure via a SqlCommand (that returns a resultset) against the specified + /// OracleTransaction using the provided parameter values. This method will query the database to discover the parameters for the + /// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. + /// + /// + /// This method provides no access to output parameters or the stored procedure's return value parameter. + /// + /// e.g.: + /// SqlDataReader dr = ExecuteReader(trans, "GetOrders", 24, 36); + /// + /// a valid OracleTransaction + /// the name of the stored procedure + /// an array of objects to be assigned as the input values of the stored procedure + /// a SqlDataReader containing the resultset generated by the command + public static OracleDataReader ExecuteReader(OracleTransaction transaction, string spName, params object[] parameterValues) + { + //if we receive parameter values, we need to figure out where they go + if ((parameterValues != null) && (parameterValues.Length > 0)) + { + OracleParameter[] commandParameters = OracleHelperParameterCache.GetSpParameterSet(transaction.Connection.ConnectionString, spName); + + AssignParameterValues(commandParameters, parameterValues); + + return ExecuteReader(transaction, CommandType.StoredProcedure, spName, commandParameters); + } + //otherwise we can just call the SP without params + return ExecuteReader(transaction, CommandType.StoredProcedure, spName); + } + + #endregion ExecuteReader + + #region ExecuteScalar + + /// + /// Execute a OracleCommand (that returns a 1x1 resultset and takes no parameters) against the database specified in + /// the connection string. + /// + /// + /// e.g.: + /// int orderCount = (int)ExecuteScalar(connString, CommandType.StoredProcedure, "GetOrderCount"); + /// + /// a valid connection string for a OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an object containing the value in the 1x1 resultset generated by the command + public static object ExecuteScalar(string connectionString, CommandType commandType, string commandText) + { + //pass through the call providing null for the set of SqlParameters + return ExecuteScalar(connectionString, commandType, commandText, null); + } + + /// + /// Execute a OracleCommand (that returns a 1x1 resultset) against the database specified in the connection string + /// using the provided parameters. + /// + /// + /// e.g.: + /// int orderCount = (int)ExecuteScalar(connString, CommandType.StoredProcedure, "GetOrderCount", new OracleParameter("@prodid", 24)); + /// + /// a valid connection string for a OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an array of SqlParamters used to execute the command + /// an object containing the value in the 1x1 resultset generated by the command + public static object ExecuteScalar(string connectionString, CommandType commandType, string commandText, params OracleParameter[] commandParameters) + { + //create & open a OracleConnection, and dispose of it after we are done. + using (OracleConnection cn = new OracleConnection(connectionString)) + { + cn.Open(); + + //call the overload that takes a connection in place of the connection string + return ExecuteScalar(cn, commandType, commandText, commandParameters); + } + } + + /// + /// Execute a stored procedure via a OracleCommand (that returns a 1x1 resultset) against the database specified in + /// the connection string using the provided parameter values. This method will query the database to discover the parameters for the + /// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. + /// + /// + /// This method provides no access to output parameters or the stored procedure's return value parameter. + /// + /// e.g.: + /// int orderCount = (int)ExecuteScalar(connString, "GetOrderCount", 24, 36); + /// + /// a valid connection string for a OracleConnection + /// the name of the stored procedure + /// an array of objects to be assigned as the input values of the stored procedure + /// an object containing the value in the 1x1 resultset generated by the command + public static object ExecuteScalar(string connectionString, string spName, params object[] parameterValues) + { + //if we receive parameter values, we need to figure out where they go + if ((parameterValues != null) && (parameterValues.Length > 0)) + { + //pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache) + OracleParameter[] commandParameters = OracleHelperParameterCache.GetSpParameterSet(connectionString, spName); + + //assign the provided values to these parameters based on parameter order + AssignParameterValues(commandParameters, parameterValues); + + //call the overload that takes an array of SqlParameters + return ExecuteScalar(connectionString, CommandType.StoredProcedure, spName, commandParameters); + } + //otherwise we can just call the SP without params + return ExecuteScalar(connectionString, CommandType.StoredProcedure, spName); + } + + /// + /// Execute a OracleCommand (that returns a 1x1 resultset and takes no parameters) against the provided OracleConnection. + /// + /// + /// e.g.: + /// int orderCount = (int)ExecuteScalar(conn, CommandType.StoredProcedure, "GetOrderCount"); + /// + /// a valid OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an object containing the value in the 1x1 resultset generated by the command + public static object ExecuteScalar(OracleConnection connection, CommandType commandType, string commandText) + { + //pass through the call providing null for the set of SqlParameters + return ExecuteScalar(connection, commandType, commandText, null); + } + + /// + /// Execute a OracleCommand (that returns a 1x1 resultset) against the specified OracleConnection + /// using the provided parameters. + /// + /// + /// e.g.: + /// int orderCount = (int)ExecuteScalar(conn, CommandType.StoredProcedure, "GetOrderCount", new OracleParameter("@prodid", 24)); + /// + /// a valid OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an array of SqlParamters used to execute the command + /// an object containing the value in the 1x1 resultset generated by the command + public static object ExecuteScalar(OracleConnection connection, CommandType commandType, string commandText, params OracleParameter[] commandParameters) + { + //create a command and prepare it for execution + OracleCommand cmd = new OracleCommand(); + PrepareCommand(cmd, connection, null, commandType, commandText, commandParameters); + + //execute the command & return the results + object retval = cmd.ExecuteScalar(); + + // detach the SqlParameters from the command object, so they can be used again. + cmd.Parameters.Clear(); + return retval; + + } + + /// + /// Execute a stored procedure via a OracleCommand (that returns a 1x1 resultset) against the specified OracleConnection + /// using the provided parameter values. This method will query the database to discover the parameters for the + /// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. + /// + /// + /// This method provides no access to output parameters or the stored procedure's return value parameter. + /// + /// e.g.: + /// int orderCount = (int)ExecuteScalar(conn, "GetOrderCount", 24, 36); + /// + /// a valid OracleConnection + /// the name of the stored procedure + /// an array of objects to be assigned as the input values of the stored procedure + /// an object containing the value in the 1x1 resultset generated by the command + public static object ExecuteScalar(OracleConnection connection, string spName, params object[] parameterValues) + { + //if we receive parameter values, we need to figure out where they go + if ((parameterValues != null) && (parameterValues.Length > 0)) + { + //pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache) + OracleParameter[] commandParameters = OracleHelperParameterCache.GetSpParameterSet(connection.ConnectionString, spName); + + //assign the provided values to these parameters based on parameter order + AssignParameterValues(commandParameters, parameterValues); + + //call the overload that takes an array of SqlParameters + return ExecuteScalar(connection, CommandType.StoredProcedure, spName, commandParameters); + } + //otherwise we can just call the SP without params + return ExecuteScalar(connection, CommandType.StoredProcedure, spName); + } + + /// + /// Execute a OracleCommand (that returns a 1x1 resultset and takes no parameters) against the provided OracleTransaction. + /// + /// + /// e.g.: + /// int orderCount = (int)ExecuteScalar(trans, CommandType.StoredProcedure, "GetOrderCount"); + /// + /// a valid OracleTransaction + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an object containing the value in the 1x1 resultset generated by the command + public static object ExecuteScalar(OracleTransaction transaction, CommandType commandType, string commandText) + { + //pass through the call providing null for the set of SqlParameters + return ExecuteScalar(transaction, commandType, commandText, null); + } + + /// + /// Execute a OracleCommand (that returns a 1x1 resultset) against the specified OracleTransaction + /// using the provided parameters. + /// + /// + /// e.g.: + /// int orderCount = (int)ExecuteScalar(trans, CommandType.StoredProcedure, "GetOrderCount", new OracleParameter("@prodid", 24)); + /// + /// a valid OracleTransaction + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an array of SqlParamters used to execute the command + /// an object containing the value in the 1x1 resultset generated by the command + public static object ExecuteScalar(OracleTransaction transaction, CommandType commandType, string commandText, params OracleParameter[] commandParameters) + { + //create a command and prepare it for execution + OracleCommand cmd = new OracleCommand(); + PrepareCommand(cmd, transaction.Connection, transaction, commandType, commandText, commandParameters); + + //execute the command & return the results + object retval = cmd.ExecuteScalar(); + + // detach the SqlParameters from the command object, so they can be used again. + cmd.Parameters.Clear(); + return retval; + } + + /// + /// Execute a stored procedure via a OracleCommand (that returns a 1x1 resultset) against the specified + /// OracleTransaction using the provided parameter values. This method will query the database to discover the parameters for the + /// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. + /// + /// + /// This method provides no access to output parameters or the stored procedure's return value parameter. + /// + /// e.g.: + /// int orderCount = (int)ExecuteScalar(trans, "GetOrderCount", 24, 36); + /// + /// a valid OracleTransaction + /// the name of the stored procedure + /// an array of objects to be assigned as the input values of the stored procedure + /// an object containing the value in the 1x1 resultset generated by the command + public static object ExecuteScalar(OracleTransaction transaction, string spName, params object[] parameterValues) + { + //if we receive parameter values, we need to figure out where they go + if ((parameterValues != null) && (parameterValues.Length > 0)) + { + //pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache) + OracleParameter[] commandParameters = OracleHelperParameterCache.GetSpParameterSet(transaction.Connection.ConnectionString, spName); + + //assign the provided values to these parameters based on parameter order + AssignParameterValues(commandParameters, parameterValues); + + //call the overload that takes an array of SqlParameters + return ExecuteScalar(transaction, CommandType.StoredProcedure, spName, commandParameters); + } + //otherwise we can just call the SP without params + return ExecuteScalar(transaction, CommandType.StoredProcedure, spName); + } + + #endregion ExecuteScalar + + + } + /// + /// OracleHelperParameterCache provides functions to leverage a static cache of procedure parameters, and the + /// ability to discover parameters for stored procedures at run-time. + /// + /// + + public sealed class OracleHelperParameterCache + { + #region private methods, variables, and constructors + + //Since this class provides only static methods, make the default constructor private to prevent + //instances from being created with "new SqlHelperParameterCache()". + private OracleHelperParameterCache() { } + + private static Hashtable paramCache = Hashtable.Synchronized(new Hashtable()); + + /// + /// resolve at run time the appropriate set of SqlParameters for a stored procedure + /// + /// a valid connection string for a OracleConnection + /// the name of the stored procedure + /// whether or not to include their return value parameter + /// + private static OracleParameter[] DiscoverSpParameterSet(string connectionString, string spName, bool includeReturnValueParameter) + { + using (OracleConnection cn = new OracleConnection(connectionString)) + using (OracleCommand cmd = new OracleCommand(spName, cn)) + { + cn.Open(); + cmd.CommandType = CommandType.StoredProcedure; + OracleCommandBuilder.DeriveParameters(cmd); + + if (!includeReturnValueParameter) + { + cmd.Parameters.RemoveAt(0); + } + + OracleParameter[] discoveredParameters = new OracleParameter[cmd.Parameters.Count]; ; + + cmd.Parameters.CopyTo(discoveredParameters, 0); + + return discoveredParameters; + } + } + + //deep copy of cached OracleParameter array + private static OracleParameter[] CloneParameters(OracleParameter[] originalParameters) + { + OracleParameter[] clonedParameters = new OracleParameter[originalParameters.Length]; + + for (int i = 0, j = originalParameters.Length; i < j; i++) + { + clonedParameters[i] = (OracleParameter)((ICloneable)originalParameters[i]).Clone(); + } + + return clonedParameters; + } + + #endregion private methods, variables, and constructors + + #region caching functions + + /// + /// add parameter array to the cache + /// + /// a valid connection string for a OracleConnection + /// the stored procedure name or T-SQL command + /// an array of SqlParamters to be cached + public static void CacheParameterSet(string connectionString, string commandText, params OracleParameter[] commandParameters) + { + string hashKey = connectionString + ":" + commandText; + + paramCache[hashKey] = commandParameters; + } + + /// + /// retrieve a parameter array from the cache + /// + /// a valid connection string for a OracleConnection + /// the stored procedure name or T-SQL command + /// an array of SqlParamters + public static OracleParameter[] GetCachedParameterSet(string connectionString, string commandText) + { + string hashKey = connectionString + ":" + commandText; + + OracleParameter[] cachedParameters = (OracleParameter[])paramCache[hashKey]; + + if (cachedParameters == null) + { + return null; + } + return CloneParameters(cachedParameters); + } + + #endregion caching functions + + #region Parameter Discovery Functions + + /// + /// Retrieves the set of SqlParameters appropriate for the stored procedure + /// + /// + /// This method will query the database for this information, and then store it in a cache for future requests. + /// + /// a valid connection string for a OracleConnection + /// the name of the stored procedure + /// an array of SqlParameters + public static OracleParameter[] GetSpParameterSet(string connectionString, string spName) + { + return GetSpParameterSet(connectionString, spName, false); + } + + /// + /// Retrieves the set of SqlParameters appropriate for the stored procedure + /// + /// + /// This method will query the database for this information, and then store it in a cache for future requests. + /// + /// a valid connection string for a OracleConnection + /// the name of the stored procedure + /// a bool value indicating whether the return value parameter should be included in the results + /// an array of SqlParameters + public static OracleParameter[] GetSpParameterSet(string connectionString, string spName, bool includeReturnValueParameter) + { + string hashKey = connectionString + ":" + spName + (includeReturnValueParameter ? ":include ReturnValue Parameter" : ""); + + OracleParameter[] cachedParameters; + + cachedParameters = (OracleParameter[])paramCache[hashKey]; + + if (cachedParameters == null) + { + cachedParameters = (OracleParameter[])(paramCache[hashKey] = DiscoverSpParameterSet(connectionString, spName, includeReturnValueParameter)); + } + + return CloneParameters(cachedParameters); + } + + #endregion Parameter Discovery Functions + } +} diff --git a/FrmDatabaseParaSettingOracle.cs b/FrmDatabaseParaSettingOracle.cs index 18c5e99..6e97dfb 100644 --- a/FrmDatabaseParaSettingOracle.cs +++ b/FrmDatabaseParaSettingOracle.cs @@ -47,12 +47,15 @@ } string serverIp = textBoxIP.Text.Trim(); + /* string hostName = System.Net.Dns.GetHostName(); if (serverIp == hostName || serverIp == "localhost" || serverIp == System.Net.Dns.GetHostAddresses(hostName).GetValue(2).ToString()) { serverIp = "127.0.0.1"; } + * */ + DateTime timeStart = DateTime.Now; GSODataSource ds = globeControl1.Globe.DataManager.GetDataSourceByName(serverIp + "/" + textBoxDatabase.Text.Trim() + "_" + textBoxUser.Text.Trim()); if (ds == null) @@ -83,7 +86,7 @@ connectParams.dataSourceName = ds.Name; connectParams.databaseType = EnumDataSourceType.Oracle; Utility.connectParamsOfDatabase.Add(connectParams); - + setUtilityValue(connectParams); WriteXML(); MessageBox.Show("连接Oracle数据库成功,用时:" + secondsConnectOracle.ToString() + "秒", "提示"); } @@ -92,6 +95,14 @@ this.Close(); } + private void setUtilityValue(DatabaseConnectParams connectParams) + { + Utility.DBServer = connectParams.ip; + Utility.Database = connectParams.databaseName; + Utility.UserID = connectParams.userName; + Utility.DBPassword = connectParams.password; + } + private void ReadXML() { string strFileName = Path.GetDirectoryName(Application.ExecutablePath) + "/databaseConfigOracle.xml"; diff --git a/GXBuilder.cs b/GXBuilder.cs new file mode 100644 index 0000000..b2ec9b2 --- /dev/null +++ b/GXBuilder.cs @@ -0,0 +1,187 @@ +using System; +using System.Data; +using System.Drawing; +using System.Runtime.InteropServices; +using GeoScene.Data; +using GeoScene.Engine; +using GeoScene.Globe; + +namespace WorldGIS +{ + public class GXBuilder : ModelBuilder + { + private static double diameter = 0.1; + + public GXBuilder(GSODataSource ds) + : base(ds) + { + + } + + public override bool validate(GSOLayer layer) + { + return true; + } + + /// + /// + /// + /// 追加或修改 + /// 高程入库或埋深入库 + /// + public override bool doBuild(EnumUpdateMode updateMode, + EnumBuildMode buildMode, + BaseParam param) + { + LineParam lineParam = param as LineParam; + GSOFeatureDataset newFeatureSet = ds.GetDatasetByName(lineParam.layerName) as GSOFeatureDataset; + if (newFeatureSet == null) + { + newFeatureSet = CreateDBFeatureDataset(layer, lineParam.layerName); + } + newFeatureSet.Open(); + GSOFeatures features = layer.GetAllFeatures(true); + for (int i = 0; i < features.Length; i++) + { + GSOFeature f = features[i]; + GSOGeoPolyline3D lineeee = f.Geometry as GSOGeoPolyline3D; + if (lineeee == null || lineeee.GetSpaceLength(true, 6378137) == 0) + { + LogHelper.Error("出现数据无法入库:" + f.ID); + continue; + } + + GSOFeature newFeature = newFeatureSet.CreateFeature(); + + double radius = diameter; //创建光纤的半径 + newFeature.Geometry = updateGemotry(f, lineParam, radius, buildMode); + newFeature.Geometry.Style = getPipeLineStyle(lineParam, f, radius); + newFeature.Name = f.GetFieldAsString(lineParam.uniqueIdFieldName); + setFeatureValueByShapeFeature(f, newFeature); + // newFeatureSet + if (newFeatureSet.GetFeatureByName(newFeature.Name, true).Length > 0) + { + if (!this.UpdateGXDevice(newFeatureSet.GetFeatureByName(newFeature.Name, true)[0], + newFeature)) + { + LogHelper.Error("光纤设备更新失败:" + newFeature.Name+"\r\n"); + } + continue; + } + newFeatureSet.AddFeature(newFeature); + if (!AddGXDevice(newFeature)) + { + LogHelper.Error("光纤数据保存Alarm_Device失败:" + newFeature.Name+"\r\n"); + } + } + newFeatureSet.Save(); + newFeatureSet.Close(); + return true; + } + + private bool AddGXDevice(GSOFeature feature) + { + //保存数据到设备表 + try + { + String deviceType = feature.GetValue("DEVICETYPE") == null + ? "" : feature.GetValue("DEVICETYPE").ToString(); + String devCode = feature.GetValue("DEVICEID") == null + ? "" : feature.GetValue("DEVICEID").ToString(); + String road = feature.GetValue("ROAD") == null + ? "" : feature.GetValue("ROAD").ToString(); + + //TODO LIST: + string sqlCount = "select dbid from alarm_device_type where" + + " typename = '" + deviceType + "'"; + object dbid = OracleUtils.ExecuteScalar(OracleUtils.ConnectionString, + CommandType.Text, sqlCount); + if (dbid == null) + { + return false; + } + int deviceTypeId = int.Parse(dbid.ToString()); + string sql = "Insert into alarm_device (DBID,ACTIVE,DEVCODE,DEVNAME,FACTORY," + + "INSTALLDATE,GAOCHENG,HEIGHT,LATITUDE,LONGTITUDE,DEVICETYPE_ID) " + + "values (SEQ_DEVICE_ID.NEXTVAL, 1, '" + devCode + "', '" + deviceType + devCode + + "', " + "'航天二院', " + "to_date('" + DateTime.Now.ToString() + "','yyyy/MM/dd hh24:mi::ss'), " + + "0, 0, 0, 0, " + deviceTypeId + ")"; + OracleUtils.ExecuteNonQuery(OracleUtils.ConnectionString, CommandType.Text, sql); + + } + catch (Exception e) + { + throw; + } + return true; + } + + private bool UpdateGXDevice(GSOFeature feature, GSOFeature newFeature) + { + String deviceType = newFeature.GetValue("DEVICETYPE") == null + ? "" : newFeature.GetValue("DEVICETYPE").ToString(); + String devCode = newFeature.GetValue("DEVICEID") == null + ? "" : newFeature.GetValue("DEVICEID").ToString(); + String road = newFeature.GetValue("ROAD") == null + ? "" : newFeature.GetValue("ROAD").ToString(); + + feature.Geometry = newFeature.Geometry.Clone(); + this.setFeatureValueByShapeFeature(newFeature,feature); + // feature.Dataset.Save(); + + string sqlCount = "select dbid from alarm_device_type where" + + " typename = '" + deviceType + "'"; + object dbid = OracleUtils.ExecuteScalar(OracleUtils.ConnectionString, + CommandType.Text, sqlCount); + if (dbid == null) + { + return false; + } + int deviceTypeId = int.Parse(dbid.ToString()); + + string sql = "update alarm_device set FACTORY='" + road + + "', DEVICETYPE_ID='" + deviceTypeId + + "', DEVNAME='"+deviceType+devCode+"' "+ + "where devcode='" + devCode + "'"; + OracleUtils.ExecuteNonQuery(OracleUtils.ConnectionString, CommandType.Text, sql); + return true; + } + + private GSOLineStyle3D getPipeLineStyle(LineParam lineParam, GSOFeature f, double radius) + { + GSOPipeLineStyle3D style0 = new GSOPipeLineStyle3D(); + style0.LineColor = Color.FromArgb(lineParam.transparency, lineParam.lineColor); + style0.Slice = lineParam.sliceNum; + style0.CornerSliceAngle = lineParam.cornerSliceAngle; + style0.Radius = radius; + return style0; + } + + private GSOGeometry updateGemotry(GSOFeature f, LineParam lineParam, double radius, EnumBuildMode buildMode) + { + + f.Geometry.AltitudeMode = (buildMode.Equals(EnumBuildMode.Alititude)) ? EnumAltitudeMode.RelativeToGround : EnumAltitudeMode.Absolute; + + GSOGeoPolyline3D line = f.Geometry as GSOGeoPolyline3D; + if (line == null) + { + return null; //log4net 记录错误处理 + } + + double deep1 = 0; + double deep2 = 0; + + GSOPoint3ds pt3ds = new GSOPoint3ds(); + for (int n = 0; n < line[0].Count; n++) + { + GSOPoint3d pt3d = line[0][n]; + pt3d.Z = 0; + + pt3ds.Add(pt3d); + } + line[0] = pt3ds; + return line; + } + + } +} diff --git a/HTForms/FrmPipelineModelDataBase.cs b/HTForms/FrmPipelineModelDataBase.cs index 84a2d7b..3076bdd 100644 --- a/HTForms/FrmPipelineModelDataBase.cs +++ b/HTForms/FrmPipelineModelDataBase.cs @@ -91,6 +91,7 @@ } else datasource = ds; + if (comboBoxExLayer.Text.Trim() == "") { MessageBox.Show("请选择一个图层文件!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning); @@ -126,20 +127,12 @@ comboBoxExLayer.Text)); if (layer == null) return; - FieldValidate fieldValidate = FieldValidateFactory.Create(ValidateConfig.LoadConfig(), - getEnumValidateType()); - - if (!fieldValidate.Validate(layer)) + if (txtModelLayer.Text != "传感设备图层") { - DateTime dt=DateTime.Now; - string logFilePath = Application.StartupPath + "\\log\\" + dt.Year + "\\" + dt.Year + dt.Month + "\\" + dt.Year + - dt.Month + dt.Day + ".txt"; - MessageBox.Show("选择的数据不符合数据规范,详情见日志" + logFilePath, "提示"); - return; + if (!getValidateResult(layer)) + return; } - ModelBuilder lineBuilder = new LineBuilder(datasource); - LineParam lineParam = new LineParam(); lineParam.layerName = txtModelLayer.Text; lineParam.uniqueIdFieldName = cmbID.Text; @@ -149,14 +142,17 @@ lineParam.diameterFieldName = cmbRadius.Text; lineParam.relativeMode = (cmbReference.Text == "管顶") ? 0 : 1; lineParam.lineColor = btnPipelineColor.BackColor; - lineParam.transparency=Convert.ToByte(ComboboxRansparency.Value); + lineParam.transparency = Convert.ToByte(ComboboxRansparency.Value); lineParam.cornerSliceAngle = Convert.ToDouble(textBoxCornerSliceAngle.Text); - lineParam.sliceNum=Convert.ToInt32(txtSlice.Text); + lineParam.sliceNum = Convert.ToInt32(txtSlice.Text); lineParam.channelWidth = comboBoxExWidth.Text; lineParam.channelHeight = comboBoxExHeight.Text; - lineBuilder.build(layer, checkBoxAdd.Checked ? EnumUpdateMode.Append : EnumUpdateMode.Update, - checkBoxDeep.Checked ? EnumBuildMode.Depth : EnumBuildMode.Alititude, lineParam); + if (txtModelLayer.Text != "传感设备图层") + lineBuilder(layer, lineParam); + else + gxLineBuilder(layer, lineParam); + addLayerToGlobeControl(lineParam.layerName); //this.DialogResult = DialogResult.OK; MessageBox.Show("入库完成!", "提示"); @@ -167,6 +163,33 @@ } } + bool getValidateResult(GSOLayer layer) + { + FieldValidate fieldValidate = FieldValidateFactory.Create(ValidateConfig.LoadConfig(), + getEnumValidateType()); + + if (fieldValidate.Validate(layer)) return true; + DateTime dt = DateTime.Now; + string logFilePath = Application.StartupPath + "\\log\\" + dt.Year + "\\" + dt.Year + dt.Month + + "\\" + dt.Year + dt.Month + dt.Day + ".txt"; + MessageBox.Show("选择的数据不符合数据规范,详情见日志" + logFilePath, "提示"); + return false; + } + + void lineBuilder(GSOLayer layer,LineParam lineParam) + { + ModelBuilder lineBuilder = new LineBuilder(datasource); + lineBuilder.build(layer, checkBoxAdd.Checked ? EnumUpdateMode.Append : EnumUpdateMode.Update, + checkBoxDeep.Checked ? EnumBuildMode.Depth : EnumBuildMode.Alititude, lineParam); + } + + void gxLineBuilder(GSOLayer layer, LineParam lineParam) + { + ModelBuilder lineBuilder = new GXBuilder(datasource); + lineBuilder.build(layer, checkBoxAdd.Checked ? EnumUpdateMode.Append : EnumUpdateMode.Update, + checkBoxDeep.Checked ? EnumBuildMode.Depth : EnumBuildMode.Alititude, lineParam); + } + private EnumValidateType getEnumValidateType() { if (comboBoxExWidth.Text != "") diff --git a/LSPipeline.csproj b/LSPipeline.csproj index 477d8ba..599b492 100644 --- a/LSPipeline.csproj +++ b/LSPipeline.csproj @@ -222,6 +222,7 @@ FrmUpdateLayerFieldValues.cs + Form @@ -243,6 +244,7 @@ + True diff --git a/LSPipeline.suo b/LSPipeline.suo index c930f27..92b5d7d 100644 --- a/LSPipeline.suo +++ b/LSPipeline.suo Binary files differ diff --git a/OracleUtils.cs b/OracleUtils.cs new file mode 100644 index 0000000..c79d316 --- /dev/null +++ b/OracleUtils.cs @@ -0,0 +1,1271 @@ +using System; +using System.Collections; +using System.Data; +using System.Data.OracleClient; + +namespace WorldGIS +{ + public abstract class OracleUtils + { + // Read the connection strings from the configuration file + //public static readonly string ConnectionString = System.Configuration.ConfigurationSettings.AppSettings["ConnectionString"]; + public static readonly string ConnectionString = @"Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=" + Utility.DBServer + + ")(PORT=1521))(CONNECT_DATA=(SID=" + Utility.Database + + ")));Persist Security Info=True;User Id=" + Utility.UserID + + "; Password=" + Utility.DBPassword + ""; + + //Create a hashtable for the parameter cached + private static Hashtable parmCache = Hashtable.Synchronized(new Hashtable()); + + #region private utility methods & constructors + + //Since this class provides only static methods, make the default constructor private to prevent + //instances from being created with "new SqlHelper()". + private OracleUtils() { } + + /// + /// This method is used to attach array of SqlParameters to a SqlCommand. + /// + /// This method will assign a value of DbNull to any parameter with a direction of + /// InputOutput and a value of null. + /// + /// This behavior will prevent default values from being used, but + /// this will be the less common case than an intended pure output parameter (derived as InputOutput) + /// where the user provided no input value. + /// + /// The command to which the parameters will be added + /// an array of SqlParameters tho be added to command + private static void AttachParameters(OracleCommand command, OracleParameter[] commandParameters) + { + foreach (OracleParameter p in commandParameters) + { + //check for derived output value with no value assigned + if ((p.Direction == ParameterDirection.InputOutput) && (p.Value == null)) + { + p.Value = DBNull.Value; + } + + command.Parameters.Add(p); + } + } + + /// + /// This method assigns an array of values to an array of SqlParameters. + /// + /// array of SqlParameters to be assigned values + /// array of objects holding the values to be assigned + private static void AssignParameterValues(OracleParameter[] commandParameters, object[] parameterValues) + { + if ((commandParameters == null) || (parameterValues == null)) + { + //do nothing if we get no data + return; + } + + // we must have the same number of values as we pave parameters to put them in + if (commandParameters.Length != parameterValues.Length) + { + throw new ArgumentException("Parameter count does not match Parameter Value count."); + } + + //iterate through the SqlParameters, assigning the values from the corresponding position in the + //value array + for (int i = 0, j = commandParameters.Length; i < j; i++) + { + commandParameters[i].Value = parameterValues[i]; + } + } + + /// + /// This method opens (if necessary) and assigns a connection, transaction, command type and parameters + /// to the provided command. + /// + /// the SqlCommand to be prepared + /// a valid OracleConnection, on which to execute this command + /// a valid OracleTransaction, or 'null' + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an array of SqlParameters to be associated with the command or 'null' if no parameters are required + private static void PrepareCommand(OracleCommand command, OracleConnection connection, OracleTransaction transaction, CommandType commandType, string commandText, OracleParameter[] commandParameters) + { + //if the provided connection is not open, we will open it + if (connection.State != ConnectionState.Open) + { + connection.Open(); + } + + //associate the connection with the command + command.Connection = connection; + + //set the command text (stored procedure name or SQL statement) + command.CommandText = commandText; + + //if we were provided a transaction, assign it. + if (transaction != null) + { + command.Transaction = transaction; + } + + //set the command type + command.CommandType = commandType; + + //attach the command parameters if they are provided + if (commandParameters != null) + { + AttachParameters(command, commandParameters); + } + } + + + #endregion private utility methods & constructors + + #region ExecuteNonQuery + + /// + /// Execute a SqlCommand (that returns no resultset and takes no parameters) against the database specified in + /// the connection string. + /// + /// + /// e.g.: + /// int result = ExecuteNonQuery(connString, CommandType.StoredProcedure, "PublishOrders"); + /// + /// a valid connection string for a OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an int representing the number of rows affected by the command + public static int ExecuteNonQuery(string connectionString, CommandType commandType, string commandText) + { + //pass through the call providing null for the set of SqlParameters + return ExecuteNonQuery(connectionString, commandType, commandText, null); + } + + /// + /// Execute a SqlCommand (that returns no resultset) against the database specified in the connection string + /// using the provided parameters. + /// + /// + /// e.g.: + /// int result = ExecuteNonQuery(connString, CommandType.StoredProcedure, "PublishOrders", new OracleParameter("@prodid", 24)); + /// + /// a valid connection string for a OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an array of SqlParamters used to execute the command + /// an int representing the number of rows affected by the command + public static int ExecuteNonQuery(string connectionString, CommandType commandType, string commandText, params OracleParameter[] commandParameters) + { + //create & open a OracleConnection, and dispose of it after we are done. + using (OracleConnection cn = new OracleConnection(connectionString)) + { + cn.Open(); + + //call the overload that takes a connection in place of the connection string + return ExecuteNonQuery(cn, commandType, commandText, commandParameters); + } + } + + /// + /// Execute a stored procedure via a SqlCommand (that returns no resultset) against the database specified in + /// the connection string using the provided parameter values. This method will query the database to discover the parameters for the + /// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. + /// + /// + /// This method provides no access to output parameters or the stored procedure's return value parameter. + /// + /// e.g.: + /// int result = ExecuteNonQuery(connString, "PublishOrders", 24, 36); + /// + /// a valid connection string for a OracleConnection + /// the name of the stored prcedure + /// an array of objects to be assigned as the input values of the stored procedure + /// an int representing the number of rows affected by the command + public static int ExecuteNonQuery(string connectionString, string spName, params object[] parameterValues) + { + //if we receive parameter values, we need to figure out where they go + if ((parameterValues != null) && (parameterValues.Length > 0)) + { + //pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache) + OracleParameter[] commandParameters = OracleHelperParameterCache.GetSpParameterSet(connectionString, spName); + + //assign the provided values to these parameters based on parameter order + AssignParameterValues(commandParameters, parameterValues); + + //call the overload that takes an array of SqlParameters + return ExecuteNonQuery(connectionString, CommandType.StoredProcedure, spName, commandParameters); + } + //otherwise we can just call the SP without params + return ExecuteNonQuery(connectionString, CommandType.StoredProcedure, spName); + } + + /// + /// Execute a SqlCommand (that returns no resultset and takes no parameters) against the provided OracleConnection. + /// + /// + /// e.g.: + /// int result = ExecuteNonQuery(conn, CommandType.StoredProcedure, "PublishOrders"); + /// + /// a valid OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an int representing the number of rows affected by the command + public static int ExecuteNonQuery(OracleConnection connection, CommandType commandType, string commandText) + { + //pass through the call providing null for the set of SqlParameters + return ExecuteNonQuery(connection, commandType, commandText, null); + } + + /// + /// Execute a SqlCommand (that returns no resultset) against the specified OracleConnection + /// using the provided parameters. + /// + /// + /// e.g.: + /// int result = ExecuteNonQuery(conn, CommandType.StoredProcedure, "PublishOrders", new OracleParameter("@prodid", 24)); + /// + /// a valid OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an array of SqlParamters used to execute the command + /// an int representing the number of rows affected by the command + public static int ExecuteNonQuery(OracleConnection connection, CommandType commandType, string commandText, params OracleParameter[] commandParameters) + { + //create a command and prepare it for execution + + OracleCommand cmd = new OracleCommand(); + PrepareCommand(cmd, connection, null, commandType, commandText, commandParameters); + + //finally, execute the command. + int retval = cmd.ExecuteNonQuery(); + + // detach the SqlParameters from the command object, so they can be used again. + cmd.Parameters.Clear(); + return retval; + } + + public static int ExecuteNonQueryWithTimeout(string connectionString, CommandType commandType, string commandText, int cmdTimeout) + { + //create a command and prepare it for execution + using (OracleConnection cn = new OracleConnection(connectionString)) + { + cn.Open(); + OracleCommand cmd = new OracleCommand(); + PrepareCommand(cmd, cn, null, commandType, commandText, null); + cmd.CommandTimeout = cmdTimeout; + //finally, execute the command. + int retval = cmd.ExecuteNonQuery(); + + // detach the SqlParameters from the command object, so they can be used again. + cmd.Parameters.Clear(); + return retval; + } + + } + /// + /// Execute a stored procedure via a SqlCommand (that returns no resultset) against the specified OracleConnection + /// using the provided parameter values. This method will query the database to discover the parameters for the + /// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. + /// + /// + /// This method provides no access to output parameters or the stored procedure's return value parameter. + /// + /// e.g.: + /// int result = ExecuteNonQuery(conn, "PublishOrders", 24, 36); + /// + /// a valid OracleConnection + /// the name of the stored procedure + /// an array of objects to be assigned as the input values of the stored procedure + /// an int representing the number of rows affected by the command + public static int ExecuteNonQuery(OracleConnection connection, string spName, params object[] parameterValues) + { + //if we receive parameter values, we need to figure out where they go + if ((parameterValues != null) && (parameterValues.Length > 0)) + { + //pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache) + OracleParameter[] commandParameters = OracleHelperParameterCache.GetSpParameterSet(connection.ConnectionString, spName); + + //assign the provided values to these parameters based on parameter order + AssignParameterValues(commandParameters, parameterValues); + + //call the overload that takes an array of SqlParameters + return ExecuteNonQuery(connection, CommandType.StoredProcedure, spName, commandParameters); + } + //otherwise we can just call the SP without params + return ExecuteNonQuery(connection, CommandType.StoredProcedure, spName); + } + + /// + /// Execute a SqlCommand (that returns no resultset and takes no parameters) against the provided OracleTransaction. + /// + /// + /// e.g.: + /// int result = ExecuteNonQuery(trans, CommandType.StoredProcedure, "PublishOrders"); + /// + /// a valid OracleTransaction + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an int representing the number of rows affected by the command + public static int ExecuteNonQuery(OracleTransaction transaction, CommandType commandType, string commandText) + { + //pass through the call providing null for the set of SqlParameters + return ExecuteNonQuery(transaction, commandType, commandText, null); + } + + /// + /// Execute a SqlCommand (that returns no resultset) against the specified OracleTransaction + /// using the provided parameters. + /// + /// + /// e.g.: + /// int result = ExecuteNonQuery(trans, CommandType.StoredProcedure, "GetOrders", new OracleParameter("@prodid", 24)); + /// + /// a valid OracleTransaction + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an array of SqlParamters used to execute the command + /// an int representing the number of rows affected by the command + public static int ExecuteNonQuery(OracleTransaction transaction, CommandType commandType, string commandText, params OracleParameter[] commandParameters) + { + //create a command and prepare it for execution + OracleCommand cmd = new OracleCommand(); + PrepareCommand(cmd, transaction.Connection, transaction, commandType, commandText, commandParameters); + + //finally, execute the command. + int retval = cmd.ExecuteNonQuery(); + + // detach the SqlParameters from the command object, so they can be used again. + cmd.Parameters.Clear(); + return retval; + } + + /// + /// Execute a stored procedure via a SqlCommand (that returns no resultset) against the specified + /// OracleTransaction using the provided parameter values. This method will query the database to discover the parameters for the + /// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. + /// + /// + /// This method provides no access to output parameters or the stored procedure's return value parameter. + /// + /// e.g.: + /// int result = ExecuteNonQuery(conn, trans, "PublishOrders", 24, 36); + /// + /// a valid OracleTransaction + /// the name of the stored procedure + /// an array of objects to be assigned as the input values of the stored procedure + /// an int representing the number of rows affected by the command + public static int ExecuteNonQuery(OracleTransaction transaction, string spName, params object[] parameterValues) + { + //if we receive parameter values, we need to figure out where they go + if ((parameterValues != null) && (parameterValues.Length > 0)) + { + //pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache) + OracleParameter[] commandParameters = OracleHelperParameterCache.GetSpParameterSet(transaction.Connection.ConnectionString, spName); + + //assign the provided values to these parameters based on parameter order + AssignParameterValues(commandParameters, parameterValues); + + //call the overload that takes an array of SqlParameters + return ExecuteNonQuery(transaction, CommandType.StoredProcedure, spName, commandParameters); + } + //otherwise we can just call the SP without params + return ExecuteNonQuery(transaction, CommandType.StoredProcedure, spName); + } + + + #endregion ExecuteNonQuery + + #region ExecuteDataSet + + /// + /// Execute a SqlCommand (that returns a resultset and takes no parameters) against the database specified in + /// the connection string. + /// + /// + /// e.g.: + /// DataSet ds = ExecuteDataset(connString, CommandType.StoredProcedure, "GetOrders"); + /// + /// a valid connection string for a OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// a dataset containing the resultset generated by the command + public static DataSet ExecuteDataset(string connectionString, CommandType commandType, string commandText) + { + //pass through the call providing null for the set of SqlParameters + return ExecuteDataset(connectionString, commandType, commandText, null); + } + + /// + /// Execute a SqlCommand (that returns a resultset) against the database specified in the connection string + /// using the provided parameters. + /// + /// + /// e.g.: + /// DataSet ds = ExecuteDataset(connString, CommandType.StoredProcedure, "GetOrders", new OracleParameter("@prodid", 24)); + /// + /// a valid connection string for a OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an array of SqlParamters used to execute the command + /// a dataset containing the resultset generated by the command + public static DataSet ExecuteDataset(string connectionString, CommandType commandType, string commandText, params OracleParameter[] commandParameters) + { + //create & open a OracleConnection, and dispose of it after we are done. + using (OracleConnection cn = new OracleConnection(connectionString)) + { + cn.Open(); + + //call the overload that takes a connection in place of the connection string + return ExecuteDataset(cn, commandType, commandText, commandParameters); + } + } + + /// + /// Execute a stored procedure via a SqlCommand (that returns a resultset) against the database specified in + /// the connection string using the provided parameter values. This method will query the database to discover the parameters for the + /// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. + /// + /// + /// This method provides no access to output parameters or the stored procedure's return value parameter. + /// + /// e.g.: + /// DataSet ds = ExecuteDataset(connString, "GetOrders", 24, 36); + /// + /// a valid connection string for a OracleConnection + /// the name of the stored procedure + /// an array of objects to be assigned as the input values of the stored procedure + /// a dataset containing the resultset generated by the command + public static DataSet ExecuteDataset(string connectionString, string spName, params object[] parameterValues) + { + //if we receive parameter values, we need to figure out where they go + if ((parameterValues != null) && (parameterValues.Length > 0)) + { + //pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache) + OracleParameter[] commandParameters = OracleHelperParameterCache.GetSpParameterSet(connectionString, spName); + + //assign the provided values to these parameters based on parameter order + AssignParameterValues(commandParameters, parameterValues); + + //call the overload that takes an array of SqlParameters + return ExecuteDataset(connectionString, CommandType.StoredProcedure, spName, commandParameters); + } + //otherwise we can just call the SP without params + return ExecuteDataset(connectionString, CommandType.StoredProcedure, spName); + } + + /// + /// Execute a SqlCommand (that returns a resultset and takes no parameters) against the provided OracleConnection. + /// + /// + /// e.g.: + /// DataSet ds = ExecuteDataset(conn, CommandType.StoredProcedure, "GetOrders"); + /// + /// a valid OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// a dataset containing the resultset generated by the command + public static DataSet ExecuteDataset(OracleConnection connection, CommandType commandType, string commandText) + { + //pass through the call providing null for the set of SqlParameters + return ExecuteDataset(connection, commandType, commandText, null); + } + + /// + /// Execute a SqlCommand (that returns a resultset) against the specified OracleConnection + /// using the provided parameters. + /// + /// + /// e.g.: + /// DataSet ds = ExecuteDataset(conn, CommandType.StoredProcedure, "GetOrders", new OracleParameter("@prodid", 24)); + /// + /// a valid OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an array of SqlParamters used to execute the command + /// a dataset containing the resultset generated by the command + public static DataSet ExecuteDataset(OracleConnection connection, CommandType commandType, string commandText, params OracleParameter[] commandParameters) + { + //create a command and prepare it for execution + OracleCommand cmd = new OracleCommand(); + PrepareCommand(cmd, connection, null, commandType, commandText, commandParameters); + + //create the DataAdapter & DataSet + OracleDataAdapter da = new OracleDataAdapter(cmd); + DataSet ds = new DataSet(); + + //fill the DataSet using default values for DataTable names, etc. + da.Fill(ds); + + // detach the SqlParameters from the command object, so they can be used again. + cmd.Parameters.Clear(); + + //return the dataset + return ds; + } + + /// + /// Execute a stored procedure via a SqlCommand (that returns a resultset) against the specified OracleConnection + /// using the provided parameter values. This method will query the database to discover the parameters for the + /// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. + /// + /// + /// This method provides no access to output parameters or the stored procedure's return value parameter. + /// + /// e.g.: + /// DataSet ds = ExecuteDataset(conn, "GetOrders", 24, 36); + /// + /// a valid OracleConnection + /// the name of the stored procedure + /// an array of objects to be assigned as the input values of the stored procedure + /// a dataset containing the resultset generated by the command + public static DataSet ExecuteDataset(OracleConnection connection, string spName, params object[] parameterValues) + { + //if we receive parameter values, we need to figure out where they go + if ((parameterValues != null) && (parameterValues.Length > 0)) + { + //pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache) + OracleParameter[] commandParameters = OracleHelperParameterCache.GetSpParameterSet(connection.ConnectionString, spName); + + //assign the provided values to these parameters based on parameter order + AssignParameterValues(commandParameters, parameterValues); + + //call the overload that takes an array of SqlParameters + return ExecuteDataset(connection, CommandType.StoredProcedure, spName, commandParameters); + } + //otherwise we can just call the SP without params + return ExecuteDataset(connection, CommandType.StoredProcedure, spName); + } + + /// + /// Execute a SqlCommand (that returns a resultset and takes no parameters) against the provided OracleTransaction. + /// + /// + /// e.g.: + /// DataSet ds = ExecuteDataset(trans, CommandType.StoredProcedure, "GetOrders"); + /// + /// a valid OracleTransaction + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// a dataset containing the resultset generated by the command + public static DataSet ExecuteDataset(OracleTransaction transaction, CommandType commandType, string commandText) + { + //pass through the call providing null for the set of SqlParameters + return ExecuteDataset(transaction, commandType, commandText, null); + } + + /// + /// Execute a SqlCommand (that returns a resultset) against the specified OracleTransaction + /// using the provided parameters. + /// + /// + /// e.g.: + /// DataSet ds = ExecuteDataset(trans, CommandType.StoredProcedure, "GetOrders", new OracleParameter("@prodid", 24)); + /// + /// a valid OracleTransaction + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an array of SqlParamters used to execute the command + /// a dataset containing the resultset generated by the command + public static DataSet ExecuteDataset(OracleTransaction transaction, CommandType commandType, string commandText, params OracleParameter[] commandParameters) + { + //create a command and prepare it for execution + OracleCommand cmd = new OracleCommand(); + PrepareCommand(cmd, transaction.Connection, transaction, commandType, commandText, commandParameters); + + //create the DataAdapter & DataSet + OracleDataAdapter da = new OracleDataAdapter(cmd); + DataSet ds = new DataSet(); + + //fill the DataSet using default values for DataTable names, etc. + da.Fill(ds); + + // detach the SqlParameters from the command object, so they can be used again. + cmd.Parameters.Clear(); + + //return the dataset + return ds; + } + + /// + /// Execute a stored procedure via a SqlCommand (that returns a resultset) against the specified + /// OracleTransaction using the provided parameter values. This method will query the database to discover the parameters for the + /// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. + /// + /// + /// This method provides no access to output parameters or the stored procedure's return value parameter. + /// + /// e.g.: + /// DataSet ds = ExecuteDataset(trans, "GetOrders", 24, 36); + /// + /// a valid OracleTransaction + /// the name of the stored procedure + /// an array of objects to be assigned as the input values of the stored procedure + /// a dataset containing the resultset generated by the command + public static DataSet ExecuteDataset(OracleTransaction transaction, string spName, params object[] parameterValues) + { + //if we receive parameter values, we need to figure out where they go + if ((parameterValues != null) && (parameterValues.Length > 0)) + { + //pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache) + OracleParameter[] commandParameters = OracleHelperParameterCache.GetSpParameterSet(transaction.Connection.ConnectionString, spName); + + //assign the provided values to these parameters based on parameter order + AssignParameterValues(commandParameters, parameterValues); + + //call the overload that takes an array of SqlParameters + return ExecuteDataset(transaction, CommandType.StoredProcedure, spName, commandParameters); + } + //otherwise we can just call the SP without params + return ExecuteDataset(transaction, CommandType.StoredProcedure, spName); + } + + #endregion ExecuteDataSet + + #region ExecuteReader + + /// + /// this enum is used to indicate whether the connection was provided by the caller, or created by SqlHelper, so that + /// we can set the appropriate CommandBehavior when calling ExecuteReader() + /// + private enum OracleConnectionOwnership + { + /// Connection is owned and managed by SqlHelper + Internal, + /// Connection is owned and managed by the caller + External + } + + /// + /// Create and prepare a SqlCommand, and call ExecuteReader with the appropriate CommandBehavior. + /// + /// + /// If we created and opened the connection, we want the connection to be closed when the DataReader is closed. + /// + /// If the caller provided the connection, we want to leave it to them to manage. + /// + /// a valid OracleConnection, on which to execute this command + /// a valid OracleTransaction, or 'null' + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an array of SqlParameters to be associated with the command or 'null' if no parameters are required + /// indicates whether the connection parameter was provided by the caller, or created by SqlHelper + /// SqlDataReader containing the results of the command + private static OracleDataReader ExecuteReader(OracleConnection connection, OracleTransaction transaction, CommandType commandType, string commandText, OracleParameter[] commandParameters, OracleConnectionOwnership connectionOwnership) + { + //create a command and prepare it for execution + OracleCommand cmd = new OracleCommand(); + PrepareCommand(cmd, connection, transaction, commandType, commandText, commandParameters); + + //create a reader + OracleDataReader dr; + + // call ExecuteReader with the appropriate CommandBehavior + if (connectionOwnership == OracleConnectionOwnership.External) + { + dr = cmd.ExecuteReader(); + } + else + { + dr = cmd.ExecuteReader(CommandBehavior.CloseConnection); + + } + + // detach the SqlParameters from the command object, so they can be used again. + cmd.Parameters.Clear(); + + return dr; + } + + /// + /// Execute a SqlCommand (that returns a resultset and takes no parameters) against the database specified in + /// the connection string. + /// + /// + /// e.g.: + /// SqlDataReader dr = ExecuteReader(connString, CommandType.StoredProcedure, "GetOrders"); + /// + /// a valid connection string for a OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// a SqlDataReader containing the resultset generated by the command + public static OracleDataReader ExecuteReader(string connectionString, CommandType commandType, string commandText) + { + //pass through the call providing null for the set of SqlParameters + return ExecuteReader(connectionString, commandType, commandText, null); + } + + /// + /// Execute a SqlCommand (that returns a resultset) against the database specified in the connection string + /// using the provided parameters. + /// + /// + /// e.g.: + /// SqlDataReader dr = ExecuteReader(connString, CommandType.StoredProcedure, "GetOrders", new OracleParameter("@prodid", 24)); + /// + /// a valid connection string for a OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an array of SqlParamters used to execute the command + /// a SqlDataReader containing the resultset generated by the command + public static OracleDataReader ExecuteReader(string connectionString, CommandType commandType, string commandText, params OracleParameter[] commandParameters) + { + //create & open a OracleConnection + OracleConnection cn = new OracleConnection(connectionString); + cn.Open(); + + try + { + //call the private overload that takes an internally owned connection in place of the connection string + return ExecuteReader(cn, null, commandType, commandText, commandParameters, OracleConnectionOwnership.Internal); + } + catch + { + //if we fail to return the SqlDatReader, we need to close the connection ourselves + cn.Close(); + throw; + } + } + + /// + /// Execute a stored procedure via a SqlCommand (that returns a resultset) against the database specified in + /// the connection string using the provided parameter values. This method will query the database to discover the parameters for the + /// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. + /// + /// + /// This method provides no access to output parameters or the stored procedure's return value parameter. + /// + /// e.g.: + /// SqlDataReader dr = ExecuteReader(connString, "GetOrders", 24, 36); + /// + /// a valid connection string for a OracleConnection + /// the name of the stored procedure + /// an array of objects to be assigned as the input values of the stored procedure + /// a SqlDataReader containing the resultset generated by the command + public static OracleDataReader ExecuteReader(string connectionString, string spName, params object[] parameterValues) + { + //if we receive parameter values, we need to figure out where they go + if ((parameterValues != null) && (parameterValues.Length > 0)) + { + //pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache) + OracleParameter[] commandParameters = OracleHelperParameterCache.GetSpParameterSet(connectionString, spName); + + //assign the provided values to these parameters based on parameter order + AssignParameterValues(commandParameters, parameterValues); + + //call the overload that takes an array of SqlParameters + return ExecuteReader(connectionString, CommandType.StoredProcedure, spName, commandParameters); + } + //otherwise we can just call the SP without params + return ExecuteReader(connectionString, CommandType.StoredProcedure, spName); + } + + /// + /// Execute a SqlCommand (that returns a resultset and takes no parameters) against the provided OracleConnection. + /// + /// + /// e.g.: + /// SqlDataReader dr = ExecuteReader(conn, CommandType.StoredProcedure, "GetOrders"); + /// + /// a valid OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// a SqlDataReader containing the resultset generated by the command + public static OracleDataReader ExecuteReader(OracleConnection connection, CommandType commandType, string commandText) + { + //pass through the call providing null for the set of SqlParameters + return ExecuteReader(connection, commandType, commandText, null); + } + + /// + /// Execute a SqlCommand (that returns a resultset) against the specified OracleConnection + /// using the provided parameters. + /// + /// + /// e.g.: + /// SqlDataReader dr = ExecuteReader(conn, CommandType.StoredProcedure, "GetOrders", new OracleParameter("@prodid", 24)); + /// + /// a valid OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an array of SqlParamters used to execute the command + /// a SqlDataReader containing the resultset generated by the command + public static OracleDataReader ExecuteReader(OracleConnection connection, CommandType commandType, string commandText, params OracleParameter[] commandParameters) + { + //pass through the call to the private overload using a null transaction value and an externally owned connection + return ExecuteReader(connection, null, commandType, commandText, commandParameters, OracleConnectionOwnership.External); + } + + /// + /// Execute a stored procedure via a SqlCommand (that returns a resultset) against the specified OracleConnection + /// using the provided parameter values. This method will query the database to discover the parameters for the + /// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. + /// + /// + /// This method provides no access to output parameters or the stored procedure's return value parameter. + /// + /// e.g.: + /// SqlDataReader dr = ExecuteReader(conn, "GetOrders", 24, 36); + /// + /// a valid OracleConnection + /// the name of the stored procedure + /// an array of objects to be assigned as the input values of the stored procedure + /// a SqlDataReader containing the resultset generated by the command + public static OracleDataReader ExecuteReader(OracleConnection connection, string spName, params object[] parameterValues) + { + //if we receive parameter values, we need to figure out where they go + if ((parameterValues != null) && (parameterValues.Length > 0)) + { + OracleParameter[] commandParameters = OracleHelperParameterCache.GetSpParameterSet(connection.ConnectionString, spName); + + AssignParameterValues(commandParameters, parameterValues); + + return ExecuteReader(connection, CommandType.StoredProcedure, spName, commandParameters); + } + //otherwise we can just call the SP without params + return ExecuteReader(connection, CommandType.StoredProcedure, spName); + } + + /// + /// Execute a SqlCommand (that returns a resultset and takes no parameters) against the provided OracleTransaction. + /// + /// + /// e.g.: + /// SqlDataReader dr = ExecuteReader(trans, CommandType.StoredProcedure, "GetOrders"); + /// + /// a valid OracleTransaction + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// a SqlDataReader containing the resultset generated by the command + public static OracleDataReader ExecuteReader(OracleTransaction transaction, CommandType commandType, string commandText) + { + //pass through the call providing null for the set of SqlParameters + return ExecuteReader(transaction, commandType, commandText, null); + } + + /// + /// Execute a SqlCommand (that returns a resultset) against the specified OracleTransaction + /// using the provided parameters. + /// + /// + /// e.g.: + /// SqlDataReader dr = ExecuteReader(trans, CommandType.StoredProcedure, "GetOrders", new OracleParameter("@prodid", 24)); + /// + /// a valid OracleTransaction + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an array of SqlParamters used to execute the command + /// a SqlDataReader containing the resultset generated by the command + public static OracleDataReader ExecuteReader(OracleTransaction transaction, CommandType commandType, string commandText, params OracleParameter[] commandParameters) + { + //pass through to private overload, indicating that the connection is owned by the caller + return ExecuteReader(transaction.Connection, transaction, commandType, commandText, commandParameters, OracleConnectionOwnership.External); + } + + /// + /// Execute a stored procedure via a SqlCommand (that returns a resultset) against the specified + /// OracleTransaction using the provided parameter values. This method will query the database to discover the parameters for the + /// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. + /// + /// + /// This method provides no access to output parameters or the stored procedure's return value parameter. + /// + /// e.g.: + /// SqlDataReader dr = ExecuteReader(trans, "GetOrders", 24, 36); + /// + /// a valid OracleTransaction + /// the name of the stored procedure + /// an array of objects to be assigned as the input values of the stored procedure + /// a SqlDataReader containing the resultset generated by the command + public static OracleDataReader ExecuteReader(OracleTransaction transaction, string spName, params object[] parameterValues) + { + //if we receive parameter values, we need to figure out where they go + if ((parameterValues != null) && (parameterValues.Length > 0)) + { + OracleParameter[] commandParameters = OracleHelperParameterCache.GetSpParameterSet(transaction.Connection.ConnectionString, spName); + + AssignParameterValues(commandParameters, parameterValues); + + return ExecuteReader(transaction, CommandType.StoredProcedure, spName, commandParameters); + } + //otherwise we can just call the SP without params + return ExecuteReader(transaction, CommandType.StoredProcedure, spName); + } + + #endregion ExecuteReader + + #region ExecuteScalar + + /// + /// Execute a OracleCommand (that returns a 1x1 resultset and takes no parameters) against the database specified in + /// the connection string. + /// + /// + /// e.g.: + /// int orderCount = (int)ExecuteScalar(connString, CommandType.StoredProcedure, "GetOrderCount"); + /// + /// a valid connection string for a OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an object containing the value in the 1x1 resultset generated by the command + public static object ExecuteScalar(string connectionString, CommandType commandType, string commandText) + { + //pass through the call providing null for the set of SqlParameters + return ExecuteScalar(connectionString, commandType, commandText, null); + } + + /// + /// Execute a OracleCommand (that returns a 1x1 resultset) against the database specified in the connection string + /// using the provided parameters. + /// + /// + /// e.g.: + /// int orderCount = (int)ExecuteScalar(connString, CommandType.StoredProcedure, "GetOrderCount", new OracleParameter("@prodid", 24)); + /// + /// a valid connection string for a OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an array of SqlParamters used to execute the command + /// an object containing the value in the 1x1 resultset generated by the command + public static object ExecuteScalar(string connectionString, CommandType commandType, string commandText, params OracleParameter[] commandParameters) + { + //create & open a OracleConnection, and dispose of it after we are done. + using (OracleConnection cn = new OracleConnection(connectionString)) + { + cn.Open(); + + //call the overload that takes a connection in place of the connection string + return ExecuteScalar(cn, commandType, commandText, commandParameters); + } + } + + /// + /// Execute a stored procedure via a OracleCommand (that returns a 1x1 resultset) against the database specified in + /// the connection string using the provided parameter values. This method will query the database to discover the parameters for the + /// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. + /// + /// + /// This method provides no access to output parameters or the stored procedure's return value parameter. + /// + /// e.g.: + /// int orderCount = (int)ExecuteScalar(connString, "GetOrderCount", 24, 36); + /// + /// a valid connection string for a OracleConnection + /// the name of the stored procedure + /// an array of objects to be assigned as the input values of the stored procedure + /// an object containing the value in the 1x1 resultset generated by the command + public static object ExecuteScalar(string connectionString, string spName, params object[] parameterValues) + { + //if we receive parameter values, we need to figure out where they go + if ((parameterValues != null) && (parameterValues.Length > 0)) + { + //pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache) + OracleParameter[] commandParameters = OracleHelperParameterCache.GetSpParameterSet(connectionString, spName); + + //assign the provided values to these parameters based on parameter order + AssignParameterValues(commandParameters, parameterValues); + + //call the overload that takes an array of SqlParameters + return ExecuteScalar(connectionString, CommandType.StoredProcedure, spName, commandParameters); + } + //otherwise we can just call the SP without params + return ExecuteScalar(connectionString, CommandType.StoredProcedure, spName); + } + + /// + /// Execute a OracleCommand (that returns a 1x1 resultset and takes no parameters) against the provided OracleConnection. + /// + /// + /// e.g.: + /// int orderCount = (int)ExecuteScalar(conn, CommandType.StoredProcedure, "GetOrderCount"); + /// + /// a valid OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an object containing the value in the 1x1 resultset generated by the command + public static object ExecuteScalar(OracleConnection connection, CommandType commandType, string commandText) + { + //pass through the call providing null for the set of SqlParameters + return ExecuteScalar(connection, commandType, commandText, null); + } + + /// + /// Execute a OracleCommand (that returns a 1x1 resultset) against the specified OracleConnection + /// using the provided parameters. + /// + /// + /// e.g.: + /// int orderCount = (int)ExecuteScalar(conn, CommandType.StoredProcedure, "GetOrderCount", new OracleParameter("@prodid", 24)); + /// + /// a valid OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an array of SqlParamters used to execute the command + /// an object containing the value in the 1x1 resultset generated by the command + public static object ExecuteScalar(OracleConnection connection, CommandType commandType, string commandText, params OracleParameter[] commandParameters) + { + //create a command and prepare it for execution + OracleCommand cmd = new OracleCommand(); + PrepareCommand(cmd, connection, null, commandType, commandText, commandParameters); + + //execute the command & return the results + object retval = cmd.ExecuteScalar(); + + // detach the SqlParameters from the command object, so they can be used again. + cmd.Parameters.Clear(); + return retval; + + } + + /// + /// Execute a stored procedure via a OracleCommand (that returns a 1x1 resultset) against the specified OracleConnection + /// using the provided parameter values. This method will query the database to discover the parameters for the + /// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. + /// + /// + /// This method provides no access to output parameters or the stored procedure's return value parameter. + /// + /// e.g.: + /// int orderCount = (int)ExecuteScalar(conn, "GetOrderCount", 24, 36); + /// + /// a valid OracleConnection + /// the name of the stored procedure + /// an array of objects to be assigned as the input values of the stored procedure + /// an object containing the value in the 1x1 resultset generated by the command + public static object ExecuteScalar(OracleConnection connection, string spName, params object[] parameterValues) + { + //if we receive parameter values, we need to figure out where they go + if ((parameterValues != null) && (parameterValues.Length > 0)) + { + //pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache) + OracleParameter[] commandParameters = OracleHelperParameterCache.GetSpParameterSet(connection.ConnectionString, spName); + + //assign the provided values to these parameters based on parameter order + AssignParameterValues(commandParameters, parameterValues); + + //call the overload that takes an array of SqlParameters + return ExecuteScalar(connection, CommandType.StoredProcedure, spName, commandParameters); + } + //otherwise we can just call the SP without params + return ExecuteScalar(connection, CommandType.StoredProcedure, spName); + } + + /// + /// Execute a OracleCommand (that returns a 1x1 resultset and takes no parameters) against the provided OracleTransaction. + /// + /// + /// e.g.: + /// int orderCount = (int)ExecuteScalar(trans, CommandType.StoredProcedure, "GetOrderCount"); + /// + /// a valid OracleTransaction + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an object containing the value in the 1x1 resultset generated by the command + public static object ExecuteScalar(OracleTransaction transaction, CommandType commandType, string commandText) + { + //pass through the call providing null for the set of SqlParameters + return ExecuteScalar(transaction, commandType, commandText, null); + } + + /// + /// Execute a OracleCommand (that returns a 1x1 resultset) against the specified OracleTransaction + /// using the provided parameters. + /// + /// + /// e.g.: + /// int orderCount = (int)ExecuteScalar(trans, CommandType.StoredProcedure, "GetOrderCount", new OracleParameter("@prodid", 24)); + /// + /// a valid OracleTransaction + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an array of SqlParamters used to execute the command + /// an object containing the value in the 1x1 resultset generated by the command + public static object ExecuteScalar(OracleTransaction transaction, CommandType commandType, string commandText, params OracleParameter[] commandParameters) + { + //create a command and prepare it for execution + OracleCommand cmd = new OracleCommand(); + PrepareCommand(cmd, transaction.Connection, transaction, commandType, commandText, commandParameters); + + //execute the command & return the results + object retval = cmd.ExecuteScalar(); + + // detach the SqlParameters from the command object, so they can be used again. + cmd.Parameters.Clear(); + return retval; + } + + /// + /// Execute a stored procedure via a OracleCommand (that returns a 1x1 resultset) against the specified + /// OracleTransaction using the provided parameter values. This method will query the database to discover the parameters for the + /// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. + /// + /// + /// This method provides no access to output parameters or the stored procedure's return value parameter. + /// + /// e.g.: + /// int orderCount = (int)ExecuteScalar(trans, "GetOrderCount", 24, 36); + /// + /// a valid OracleTransaction + /// the name of the stored procedure + /// an array of objects to be assigned as the input values of the stored procedure + /// an object containing the value in the 1x1 resultset generated by the command + public static object ExecuteScalar(OracleTransaction transaction, string spName, params object[] parameterValues) + { + //if we receive parameter values, we need to figure out where they go + if ((parameterValues != null) && (parameterValues.Length > 0)) + { + //pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache) + OracleParameter[] commandParameters = OracleHelperParameterCache.GetSpParameterSet(transaction.Connection.ConnectionString, spName); + + //assign the provided values to these parameters based on parameter order + AssignParameterValues(commandParameters, parameterValues); + + //call the overload that takes an array of SqlParameters + return ExecuteScalar(transaction, CommandType.StoredProcedure, spName, commandParameters); + } + //otherwise we can just call the SP without params + return ExecuteScalar(transaction, CommandType.StoredProcedure, spName); + } + + #endregion ExecuteScalar + + + } + /// + /// OracleHelperParameterCache provides functions to leverage a static cache of procedure parameters, and the + /// ability to discover parameters for stored procedures at run-time. + /// + /// + + public sealed class OracleHelperParameterCache + { + #region private methods, variables, and constructors + + //Since this class provides only static methods, make the default constructor private to prevent + //instances from being created with "new SqlHelperParameterCache()". + private OracleHelperParameterCache() { } + + private static Hashtable paramCache = Hashtable.Synchronized(new Hashtable()); + + /// + /// resolve at run time the appropriate set of SqlParameters for a stored procedure + /// + /// a valid connection string for a OracleConnection + /// the name of the stored procedure + /// whether or not to include their return value parameter + /// + private static OracleParameter[] DiscoverSpParameterSet(string connectionString, string spName, bool includeReturnValueParameter) + { + using (OracleConnection cn = new OracleConnection(connectionString)) + using (OracleCommand cmd = new OracleCommand(spName, cn)) + { + cn.Open(); + cmd.CommandType = CommandType.StoredProcedure; + OracleCommandBuilder.DeriveParameters(cmd); + + if (!includeReturnValueParameter) + { + cmd.Parameters.RemoveAt(0); + } + + OracleParameter[] discoveredParameters = new OracleParameter[cmd.Parameters.Count]; ; + + cmd.Parameters.CopyTo(discoveredParameters, 0); + + return discoveredParameters; + } + } + + //deep copy of cached OracleParameter array + private static OracleParameter[] CloneParameters(OracleParameter[] originalParameters) + { + OracleParameter[] clonedParameters = new OracleParameter[originalParameters.Length]; + + for (int i = 0, j = originalParameters.Length; i < j; i++) + { + clonedParameters[i] = (OracleParameter)((ICloneable)originalParameters[i]).Clone(); + } + + return clonedParameters; + } + + #endregion private methods, variables, and constructors + + #region caching functions + + /// + /// add parameter array to the cache + /// + /// a valid connection string for a OracleConnection + /// the stored procedure name or T-SQL command + /// an array of SqlParamters to be cached + public static void CacheParameterSet(string connectionString, string commandText, params OracleParameter[] commandParameters) + { + string hashKey = connectionString + ":" + commandText; + + paramCache[hashKey] = commandParameters; + } + + /// + /// retrieve a parameter array from the cache + /// + /// a valid connection string for a OracleConnection + /// the stored procedure name or T-SQL command + /// an array of SqlParamters + public static OracleParameter[] GetCachedParameterSet(string connectionString, string commandText) + { + string hashKey = connectionString + ":" + commandText; + + OracleParameter[] cachedParameters = (OracleParameter[])paramCache[hashKey]; + + if (cachedParameters == null) + { + return null; + } + return CloneParameters(cachedParameters); + } + + #endregion caching functions + + #region Parameter Discovery Functions + + /// + /// Retrieves the set of SqlParameters appropriate for the stored procedure + /// + /// + /// This method will query the database for this information, and then store it in a cache for future requests. + /// + /// a valid connection string for a OracleConnection + /// the name of the stored procedure + /// an array of SqlParameters + public static OracleParameter[] GetSpParameterSet(string connectionString, string spName) + { + return GetSpParameterSet(connectionString, spName, false); + } + + /// + /// Retrieves the set of SqlParameters appropriate for the stored procedure + /// + /// + /// This method will query the database for this information, and then store it in a cache for future requests. + /// + /// a valid connection string for a OracleConnection + /// the name of the stored procedure + /// a bool value indicating whether the return value parameter should be included in the results + /// an array of SqlParameters + public static OracleParameter[] GetSpParameterSet(string connectionString, string spName, bool includeReturnValueParameter) + { + string hashKey = connectionString + ":" + spName + (includeReturnValueParameter ? ":include ReturnValue Parameter" : ""); + + OracleParameter[] cachedParameters; + + cachedParameters = (OracleParameter[])paramCache[hashKey]; + + if (cachedParameters == null) + { + cachedParameters = (OracleParameter[])(paramCache[hashKey] = DiscoverSpParameterSet(connectionString, spName, includeReturnValueParameter)); + } + + return CloneParameters(cachedParameters); + } + + #endregion Parameter Discovery Functions + } +} diff --git a/Utility.cs b/Utility.cs index 1429fd9..4e64d66 100644 --- a/Utility.cs +++ b/Utility.cs @@ -17,6 +17,11 @@ { public class Utility { + public static string DBServer; + public static string Database; + public static string UserID; + public static string DBPassword; + public static void SetBallons(GSOBalloon featureTooltip,GSOBalloonEx balloonEx) { featureTooltip.CacheFilePath = Path.GetDirectoryName(Application.ExecutablePath) + "/GeoScene/Globe/Temp"; diff --git a/FrmDatabaseParaSettingOracle.cs b/FrmDatabaseParaSettingOracle.cs index 18c5e99..6e97dfb 100644 --- a/FrmDatabaseParaSettingOracle.cs +++ b/FrmDatabaseParaSettingOracle.cs @@ -47,12 +47,15 @@ } string serverIp = textBoxIP.Text.Trim(); + /* string hostName = System.Net.Dns.GetHostName(); if (serverIp == hostName || serverIp == "localhost" || serverIp == System.Net.Dns.GetHostAddresses(hostName).GetValue(2).ToString()) { serverIp = "127.0.0.1"; } + * */ + DateTime timeStart = DateTime.Now; GSODataSource ds = globeControl1.Globe.DataManager.GetDataSourceByName(serverIp + "/" + textBoxDatabase.Text.Trim() + "_" + textBoxUser.Text.Trim()); if (ds == null) @@ -83,7 +86,7 @@ connectParams.dataSourceName = ds.Name; connectParams.databaseType = EnumDataSourceType.Oracle; Utility.connectParamsOfDatabase.Add(connectParams); - + setUtilityValue(connectParams); WriteXML(); MessageBox.Show("连接Oracle数据库成功,用时:" + secondsConnectOracle.ToString() + "秒", "提示"); } @@ -92,6 +95,14 @@ this.Close(); } + private void setUtilityValue(DatabaseConnectParams connectParams) + { + Utility.DBServer = connectParams.ip; + Utility.Database = connectParams.databaseName; + Utility.UserID = connectParams.userName; + Utility.DBPassword = connectParams.password; + } + private void ReadXML() { string strFileName = Path.GetDirectoryName(Application.ExecutablePath) + "/databaseConfigOracle.xml"; diff --git a/GXBuilder.cs b/GXBuilder.cs new file mode 100644 index 0000000..b2ec9b2 --- /dev/null +++ b/GXBuilder.cs @@ -0,0 +1,187 @@ +using System; +using System.Data; +using System.Drawing; +using System.Runtime.InteropServices; +using GeoScene.Data; +using GeoScene.Engine; +using GeoScene.Globe; + +namespace WorldGIS +{ + public class GXBuilder : ModelBuilder + { + private static double diameter = 0.1; + + public GXBuilder(GSODataSource ds) + : base(ds) + { + + } + + public override bool validate(GSOLayer layer) + { + return true; + } + + /// + /// + /// + /// 追加或修改 + /// 高程入库或埋深入库 + /// + public override bool doBuild(EnumUpdateMode updateMode, + EnumBuildMode buildMode, + BaseParam param) + { + LineParam lineParam = param as LineParam; + GSOFeatureDataset newFeatureSet = ds.GetDatasetByName(lineParam.layerName) as GSOFeatureDataset; + if (newFeatureSet == null) + { + newFeatureSet = CreateDBFeatureDataset(layer, lineParam.layerName); + } + newFeatureSet.Open(); + GSOFeatures features = layer.GetAllFeatures(true); + for (int i = 0; i < features.Length; i++) + { + GSOFeature f = features[i]; + GSOGeoPolyline3D lineeee = f.Geometry as GSOGeoPolyline3D; + if (lineeee == null || lineeee.GetSpaceLength(true, 6378137) == 0) + { + LogHelper.Error("出现数据无法入库:" + f.ID); + continue; + } + + GSOFeature newFeature = newFeatureSet.CreateFeature(); + + double radius = diameter; //创建光纤的半径 + newFeature.Geometry = updateGemotry(f, lineParam, radius, buildMode); + newFeature.Geometry.Style = getPipeLineStyle(lineParam, f, radius); + newFeature.Name = f.GetFieldAsString(lineParam.uniqueIdFieldName); + setFeatureValueByShapeFeature(f, newFeature); + // newFeatureSet + if (newFeatureSet.GetFeatureByName(newFeature.Name, true).Length > 0) + { + if (!this.UpdateGXDevice(newFeatureSet.GetFeatureByName(newFeature.Name, true)[0], + newFeature)) + { + LogHelper.Error("光纤设备更新失败:" + newFeature.Name+"\r\n"); + } + continue; + } + newFeatureSet.AddFeature(newFeature); + if (!AddGXDevice(newFeature)) + { + LogHelper.Error("光纤数据保存Alarm_Device失败:" + newFeature.Name+"\r\n"); + } + } + newFeatureSet.Save(); + newFeatureSet.Close(); + return true; + } + + private bool AddGXDevice(GSOFeature feature) + { + //保存数据到设备表 + try + { + String deviceType = feature.GetValue("DEVICETYPE") == null + ? "" : feature.GetValue("DEVICETYPE").ToString(); + String devCode = feature.GetValue("DEVICEID") == null + ? "" : feature.GetValue("DEVICEID").ToString(); + String road = feature.GetValue("ROAD") == null + ? "" : feature.GetValue("ROAD").ToString(); + + //TODO LIST: + string sqlCount = "select dbid from alarm_device_type where" + + " typename = '" + deviceType + "'"; + object dbid = OracleUtils.ExecuteScalar(OracleUtils.ConnectionString, + CommandType.Text, sqlCount); + if (dbid == null) + { + return false; + } + int deviceTypeId = int.Parse(dbid.ToString()); + string sql = "Insert into alarm_device (DBID,ACTIVE,DEVCODE,DEVNAME,FACTORY," + + "INSTALLDATE,GAOCHENG,HEIGHT,LATITUDE,LONGTITUDE,DEVICETYPE_ID) " + + "values (SEQ_DEVICE_ID.NEXTVAL, 1, '" + devCode + "', '" + deviceType + devCode + + "', " + "'航天二院', " + "to_date('" + DateTime.Now.ToString() + "','yyyy/MM/dd hh24:mi::ss'), " + + "0, 0, 0, 0, " + deviceTypeId + ")"; + OracleUtils.ExecuteNonQuery(OracleUtils.ConnectionString, CommandType.Text, sql); + + } + catch (Exception e) + { + throw; + } + return true; + } + + private bool UpdateGXDevice(GSOFeature feature, GSOFeature newFeature) + { + String deviceType = newFeature.GetValue("DEVICETYPE") == null + ? "" : newFeature.GetValue("DEVICETYPE").ToString(); + String devCode = newFeature.GetValue("DEVICEID") == null + ? "" : newFeature.GetValue("DEVICEID").ToString(); + String road = newFeature.GetValue("ROAD") == null + ? "" : newFeature.GetValue("ROAD").ToString(); + + feature.Geometry = newFeature.Geometry.Clone(); + this.setFeatureValueByShapeFeature(newFeature,feature); + // feature.Dataset.Save(); + + string sqlCount = "select dbid from alarm_device_type where" + + " typename = '" + deviceType + "'"; + object dbid = OracleUtils.ExecuteScalar(OracleUtils.ConnectionString, + CommandType.Text, sqlCount); + if (dbid == null) + { + return false; + } + int deviceTypeId = int.Parse(dbid.ToString()); + + string sql = "update alarm_device set FACTORY='" + road + + "', DEVICETYPE_ID='" + deviceTypeId + + "', DEVNAME='"+deviceType+devCode+"' "+ + "where devcode='" + devCode + "'"; + OracleUtils.ExecuteNonQuery(OracleUtils.ConnectionString, CommandType.Text, sql); + return true; + } + + private GSOLineStyle3D getPipeLineStyle(LineParam lineParam, GSOFeature f, double radius) + { + GSOPipeLineStyle3D style0 = new GSOPipeLineStyle3D(); + style0.LineColor = Color.FromArgb(lineParam.transparency, lineParam.lineColor); + style0.Slice = lineParam.sliceNum; + style0.CornerSliceAngle = lineParam.cornerSliceAngle; + style0.Radius = radius; + return style0; + } + + private GSOGeometry updateGemotry(GSOFeature f, LineParam lineParam, double radius, EnumBuildMode buildMode) + { + + f.Geometry.AltitudeMode = (buildMode.Equals(EnumBuildMode.Alititude)) ? EnumAltitudeMode.RelativeToGround : EnumAltitudeMode.Absolute; + + GSOGeoPolyline3D line = f.Geometry as GSOGeoPolyline3D; + if (line == null) + { + return null; //log4net 记录错误处理 + } + + double deep1 = 0; + double deep2 = 0; + + GSOPoint3ds pt3ds = new GSOPoint3ds(); + for (int n = 0; n < line[0].Count; n++) + { + GSOPoint3d pt3d = line[0][n]; + pt3d.Z = 0; + + pt3ds.Add(pt3d); + } + line[0] = pt3ds; + return line; + } + + } +} diff --git a/HTForms/FrmPipelineModelDataBase.cs b/HTForms/FrmPipelineModelDataBase.cs index 84a2d7b..3076bdd 100644 --- a/HTForms/FrmPipelineModelDataBase.cs +++ b/HTForms/FrmPipelineModelDataBase.cs @@ -91,6 +91,7 @@ } else datasource = ds; + if (comboBoxExLayer.Text.Trim() == "") { MessageBox.Show("请选择一个图层文件!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning); @@ -126,20 +127,12 @@ comboBoxExLayer.Text)); if (layer == null) return; - FieldValidate fieldValidate = FieldValidateFactory.Create(ValidateConfig.LoadConfig(), - getEnumValidateType()); - - if (!fieldValidate.Validate(layer)) + if (txtModelLayer.Text != "传感设备图层") { - DateTime dt=DateTime.Now; - string logFilePath = Application.StartupPath + "\\log\\" + dt.Year + "\\" + dt.Year + dt.Month + "\\" + dt.Year + - dt.Month + dt.Day + ".txt"; - MessageBox.Show("选择的数据不符合数据规范,详情见日志" + logFilePath, "提示"); - return; + if (!getValidateResult(layer)) + return; } - ModelBuilder lineBuilder = new LineBuilder(datasource); - LineParam lineParam = new LineParam(); lineParam.layerName = txtModelLayer.Text; lineParam.uniqueIdFieldName = cmbID.Text; @@ -149,14 +142,17 @@ lineParam.diameterFieldName = cmbRadius.Text; lineParam.relativeMode = (cmbReference.Text == "管顶") ? 0 : 1; lineParam.lineColor = btnPipelineColor.BackColor; - lineParam.transparency=Convert.ToByte(ComboboxRansparency.Value); + lineParam.transparency = Convert.ToByte(ComboboxRansparency.Value); lineParam.cornerSliceAngle = Convert.ToDouble(textBoxCornerSliceAngle.Text); - lineParam.sliceNum=Convert.ToInt32(txtSlice.Text); + lineParam.sliceNum = Convert.ToInt32(txtSlice.Text); lineParam.channelWidth = comboBoxExWidth.Text; lineParam.channelHeight = comboBoxExHeight.Text; - lineBuilder.build(layer, checkBoxAdd.Checked ? EnumUpdateMode.Append : EnumUpdateMode.Update, - checkBoxDeep.Checked ? EnumBuildMode.Depth : EnumBuildMode.Alititude, lineParam); + if (txtModelLayer.Text != "传感设备图层") + lineBuilder(layer, lineParam); + else + gxLineBuilder(layer, lineParam); + addLayerToGlobeControl(lineParam.layerName); //this.DialogResult = DialogResult.OK; MessageBox.Show("入库完成!", "提示"); @@ -167,6 +163,33 @@ } } + bool getValidateResult(GSOLayer layer) + { + FieldValidate fieldValidate = FieldValidateFactory.Create(ValidateConfig.LoadConfig(), + getEnumValidateType()); + + if (fieldValidate.Validate(layer)) return true; + DateTime dt = DateTime.Now; + string logFilePath = Application.StartupPath + "\\log\\" + dt.Year + "\\" + dt.Year + dt.Month + + "\\" + dt.Year + dt.Month + dt.Day + ".txt"; + MessageBox.Show("选择的数据不符合数据规范,详情见日志" + logFilePath, "提示"); + return false; + } + + void lineBuilder(GSOLayer layer,LineParam lineParam) + { + ModelBuilder lineBuilder = new LineBuilder(datasource); + lineBuilder.build(layer, checkBoxAdd.Checked ? EnumUpdateMode.Append : EnumUpdateMode.Update, + checkBoxDeep.Checked ? EnumBuildMode.Depth : EnumBuildMode.Alititude, lineParam); + } + + void gxLineBuilder(GSOLayer layer, LineParam lineParam) + { + ModelBuilder lineBuilder = new GXBuilder(datasource); + lineBuilder.build(layer, checkBoxAdd.Checked ? EnumUpdateMode.Append : EnumUpdateMode.Update, + checkBoxDeep.Checked ? EnumBuildMode.Depth : EnumBuildMode.Alititude, lineParam); + } + private EnumValidateType getEnumValidateType() { if (comboBoxExWidth.Text != "") diff --git a/LSPipeline.csproj b/LSPipeline.csproj index 477d8ba..599b492 100644 --- a/LSPipeline.csproj +++ b/LSPipeline.csproj @@ -222,6 +222,7 @@ FrmUpdateLayerFieldValues.cs + Form @@ -243,6 +244,7 @@ + True diff --git a/LSPipeline.suo b/LSPipeline.suo index c930f27..92b5d7d 100644 --- a/LSPipeline.suo +++ b/LSPipeline.suo Binary files differ diff --git a/OracleUtils.cs b/OracleUtils.cs new file mode 100644 index 0000000..c79d316 --- /dev/null +++ b/OracleUtils.cs @@ -0,0 +1,1271 @@ +using System; +using System.Collections; +using System.Data; +using System.Data.OracleClient; + +namespace WorldGIS +{ + public abstract class OracleUtils + { + // Read the connection strings from the configuration file + //public static readonly string ConnectionString = System.Configuration.ConfigurationSettings.AppSettings["ConnectionString"]; + public static readonly string ConnectionString = @"Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=" + Utility.DBServer + + ")(PORT=1521))(CONNECT_DATA=(SID=" + Utility.Database + + ")));Persist Security Info=True;User Id=" + Utility.UserID + + "; Password=" + Utility.DBPassword + ""; + + //Create a hashtable for the parameter cached + private static Hashtable parmCache = Hashtable.Synchronized(new Hashtable()); + + #region private utility methods & constructors + + //Since this class provides only static methods, make the default constructor private to prevent + //instances from being created with "new SqlHelper()". + private OracleUtils() { } + + /// + /// This method is used to attach array of SqlParameters to a SqlCommand. + /// + /// This method will assign a value of DbNull to any parameter with a direction of + /// InputOutput and a value of null. + /// + /// This behavior will prevent default values from being used, but + /// this will be the less common case than an intended pure output parameter (derived as InputOutput) + /// where the user provided no input value. + /// + /// The command to which the parameters will be added + /// an array of SqlParameters tho be added to command + private static void AttachParameters(OracleCommand command, OracleParameter[] commandParameters) + { + foreach (OracleParameter p in commandParameters) + { + //check for derived output value with no value assigned + if ((p.Direction == ParameterDirection.InputOutput) && (p.Value == null)) + { + p.Value = DBNull.Value; + } + + command.Parameters.Add(p); + } + } + + /// + /// This method assigns an array of values to an array of SqlParameters. + /// + /// array of SqlParameters to be assigned values + /// array of objects holding the values to be assigned + private static void AssignParameterValues(OracleParameter[] commandParameters, object[] parameterValues) + { + if ((commandParameters == null) || (parameterValues == null)) + { + //do nothing if we get no data + return; + } + + // we must have the same number of values as we pave parameters to put them in + if (commandParameters.Length != parameterValues.Length) + { + throw new ArgumentException("Parameter count does not match Parameter Value count."); + } + + //iterate through the SqlParameters, assigning the values from the corresponding position in the + //value array + for (int i = 0, j = commandParameters.Length; i < j; i++) + { + commandParameters[i].Value = parameterValues[i]; + } + } + + /// + /// This method opens (if necessary) and assigns a connection, transaction, command type and parameters + /// to the provided command. + /// + /// the SqlCommand to be prepared + /// a valid OracleConnection, on which to execute this command + /// a valid OracleTransaction, or 'null' + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an array of SqlParameters to be associated with the command or 'null' if no parameters are required + private static void PrepareCommand(OracleCommand command, OracleConnection connection, OracleTransaction transaction, CommandType commandType, string commandText, OracleParameter[] commandParameters) + { + //if the provided connection is not open, we will open it + if (connection.State != ConnectionState.Open) + { + connection.Open(); + } + + //associate the connection with the command + command.Connection = connection; + + //set the command text (stored procedure name or SQL statement) + command.CommandText = commandText; + + //if we were provided a transaction, assign it. + if (transaction != null) + { + command.Transaction = transaction; + } + + //set the command type + command.CommandType = commandType; + + //attach the command parameters if they are provided + if (commandParameters != null) + { + AttachParameters(command, commandParameters); + } + } + + + #endregion private utility methods & constructors + + #region ExecuteNonQuery + + /// + /// Execute a SqlCommand (that returns no resultset and takes no parameters) against the database specified in + /// the connection string. + /// + /// + /// e.g.: + /// int result = ExecuteNonQuery(connString, CommandType.StoredProcedure, "PublishOrders"); + /// + /// a valid connection string for a OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an int representing the number of rows affected by the command + public static int ExecuteNonQuery(string connectionString, CommandType commandType, string commandText) + { + //pass through the call providing null for the set of SqlParameters + return ExecuteNonQuery(connectionString, commandType, commandText, null); + } + + /// + /// Execute a SqlCommand (that returns no resultset) against the database specified in the connection string + /// using the provided parameters. + /// + /// + /// e.g.: + /// int result = ExecuteNonQuery(connString, CommandType.StoredProcedure, "PublishOrders", new OracleParameter("@prodid", 24)); + /// + /// a valid connection string for a OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an array of SqlParamters used to execute the command + /// an int representing the number of rows affected by the command + public static int ExecuteNonQuery(string connectionString, CommandType commandType, string commandText, params OracleParameter[] commandParameters) + { + //create & open a OracleConnection, and dispose of it after we are done. + using (OracleConnection cn = new OracleConnection(connectionString)) + { + cn.Open(); + + //call the overload that takes a connection in place of the connection string + return ExecuteNonQuery(cn, commandType, commandText, commandParameters); + } + } + + /// + /// Execute a stored procedure via a SqlCommand (that returns no resultset) against the database specified in + /// the connection string using the provided parameter values. This method will query the database to discover the parameters for the + /// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. + /// + /// + /// This method provides no access to output parameters or the stored procedure's return value parameter. + /// + /// e.g.: + /// int result = ExecuteNonQuery(connString, "PublishOrders", 24, 36); + /// + /// a valid connection string for a OracleConnection + /// the name of the stored prcedure + /// an array of objects to be assigned as the input values of the stored procedure + /// an int representing the number of rows affected by the command + public static int ExecuteNonQuery(string connectionString, string spName, params object[] parameterValues) + { + //if we receive parameter values, we need to figure out where they go + if ((parameterValues != null) && (parameterValues.Length > 0)) + { + //pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache) + OracleParameter[] commandParameters = OracleHelperParameterCache.GetSpParameterSet(connectionString, spName); + + //assign the provided values to these parameters based on parameter order + AssignParameterValues(commandParameters, parameterValues); + + //call the overload that takes an array of SqlParameters + return ExecuteNonQuery(connectionString, CommandType.StoredProcedure, spName, commandParameters); + } + //otherwise we can just call the SP without params + return ExecuteNonQuery(connectionString, CommandType.StoredProcedure, spName); + } + + /// + /// Execute a SqlCommand (that returns no resultset and takes no parameters) against the provided OracleConnection. + /// + /// + /// e.g.: + /// int result = ExecuteNonQuery(conn, CommandType.StoredProcedure, "PublishOrders"); + /// + /// a valid OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an int representing the number of rows affected by the command + public static int ExecuteNonQuery(OracleConnection connection, CommandType commandType, string commandText) + { + //pass through the call providing null for the set of SqlParameters + return ExecuteNonQuery(connection, commandType, commandText, null); + } + + /// + /// Execute a SqlCommand (that returns no resultset) against the specified OracleConnection + /// using the provided parameters. + /// + /// + /// e.g.: + /// int result = ExecuteNonQuery(conn, CommandType.StoredProcedure, "PublishOrders", new OracleParameter("@prodid", 24)); + /// + /// a valid OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an array of SqlParamters used to execute the command + /// an int representing the number of rows affected by the command + public static int ExecuteNonQuery(OracleConnection connection, CommandType commandType, string commandText, params OracleParameter[] commandParameters) + { + //create a command and prepare it for execution + + OracleCommand cmd = new OracleCommand(); + PrepareCommand(cmd, connection, null, commandType, commandText, commandParameters); + + //finally, execute the command. + int retval = cmd.ExecuteNonQuery(); + + // detach the SqlParameters from the command object, so they can be used again. + cmd.Parameters.Clear(); + return retval; + } + + public static int ExecuteNonQueryWithTimeout(string connectionString, CommandType commandType, string commandText, int cmdTimeout) + { + //create a command and prepare it for execution + using (OracleConnection cn = new OracleConnection(connectionString)) + { + cn.Open(); + OracleCommand cmd = new OracleCommand(); + PrepareCommand(cmd, cn, null, commandType, commandText, null); + cmd.CommandTimeout = cmdTimeout; + //finally, execute the command. + int retval = cmd.ExecuteNonQuery(); + + // detach the SqlParameters from the command object, so they can be used again. + cmd.Parameters.Clear(); + return retval; + } + + } + /// + /// Execute a stored procedure via a SqlCommand (that returns no resultset) against the specified OracleConnection + /// using the provided parameter values. This method will query the database to discover the parameters for the + /// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. + /// + /// + /// This method provides no access to output parameters or the stored procedure's return value parameter. + /// + /// e.g.: + /// int result = ExecuteNonQuery(conn, "PublishOrders", 24, 36); + /// + /// a valid OracleConnection + /// the name of the stored procedure + /// an array of objects to be assigned as the input values of the stored procedure + /// an int representing the number of rows affected by the command + public static int ExecuteNonQuery(OracleConnection connection, string spName, params object[] parameterValues) + { + //if we receive parameter values, we need to figure out where they go + if ((parameterValues != null) && (parameterValues.Length > 0)) + { + //pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache) + OracleParameter[] commandParameters = OracleHelperParameterCache.GetSpParameterSet(connection.ConnectionString, spName); + + //assign the provided values to these parameters based on parameter order + AssignParameterValues(commandParameters, parameterValues); + + //call the overload that takes an array of SqlParameters + return ExecuteNonQuery(connection, CommandType.StoredProcedure, spName, commandParameters); + } + //otherwise we can just call the SP without params + return ExecuteNonQuery(connection, CommandType.StoredProcedure, spName); + } + + /// + /// Execute a SqlCommand (that returns no resultset and takes no parameters) against the provided OracleTransaction. + /// + /// + /// e.g.: + /// int result = ExecuteNonQuery(trans, CommandType.StoredProcedure, "PublishOrders"); + /// + /// a valid OracleTransaction + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an int representing the number of rows affected by the command + public static int ExecuteNonQuery(OracleTransaction transaction, CommandType commandType, string commandText) + { + //pass through the call providing null for the set of SqlParameters + return ExecuteNonQuery(transaction, commandType, commandText, null); + } + + /// + /// Execute a SqlCommand (that returns no resultset) against the specified OracleTransaction + /// using the provided parameters. + /// + /// + /// e.g.: + /// int result = ExecuteNonQuery(trans, CommandType.StoredProcedure, "GetOrders", new OracleParameter("@prodid", 24)); + /// + /// a valid OracleTransaction + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an array of SqlParamters used to execute the command + /// an int representing the number of rows affected by the command + public static int ExecuteNonQuery(OracleTransaction transaction, CommandType commandType, string commandText, params OracleParameter[] commandParameters) + { + //create a command and prepare it for execution + OracleCommand cmd = new OracleCommand(); + PrepareCommand(cmd, transaction.Connection, transaction, commandType, commandText, commandParameters); + + //finally, execute the command. + int retval = cmd.ExecuteNonQuery(); + + // detach the SqlParameters from the command object, so they can be used again. + cmd.Parameters.Clear(); + return retval; + } + + /// + /// Execute a stored procedure via a SqlCommand (that returns no resultset) against the specified + /// OracleTransaction using the provided parameter values. This method will query the database to discover the parameters for the + /// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. + /// + /// + /// This method provides no access to output parameters or the stored procedure's return value parameter. + /// + /// e.g.: + /// int result = ExecuteNonQuery(conn, trans, "PublishOrders", 24, 36); + /// + /// a valid OracleTransaction + /// the name of the stored procedure + /// an array of objects to be assigned as the input values of the stored procedure + /// an int representing the number of rows affected by the command + public static int ExecuteNonQuery(OracleTransaction transaction, string spName, params object[] parameterValues) + { + //if we receive parameter values, we need to figure out where they go + if ((parameterValues != null) && (parameterValues.Length > 0)) + { + //pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache) + OracleParameter[] commandParameters = OracleHelperParameterCache.GetSpParameterSet(transaction.Connection.ConnectionString, spName); + + //assign the provided values to these parameters based on parameter order + AssignParameterValues(commandParameters, parameterValues); + + //call the overload that takes an array of SqlParameters + return ExecuteNonQuery(transaction, CommandType.StoredProcedure, spName, commandParameters); + } + //otherwise we can just call the SP without params + return ExecuteNonQuery(transaction, CommandType.StoredProcedure, spName); + } + + + #endregion ExecuteNonQuery + + #region ExecuteDataSet + + /// + /// Execute a SqlCommand (that returns a resultset and takes no parameters) against the database specified in + /// the connection string. + /// + /// + /// e.g.: + /// DataSet ds = ExecuteDataset(connString, CommandType.StoredProcedure, "GetOrders"); + /// + /// a valid connection string for a OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// a dataset containing the resultset generated by the command + public static DataSet ExecuteDataset(string connectionString, CommandType commandType, string commandText) + { + //pass through the call providing null for the set of SqlParameters + return ExecuteDataset(connectionString, commandType, commandText, null); + } + + /// + /// Execute a SqlCommand (that returns a resultset) against the database specified in the connection string + /// using the provided parameters. + /// + /// + /// e.g.: + /// DataSet ds = ExecuteDataset(connString, CommandType.StoredProcedure, "GetOrders", new OracleParameter("@prodid", 24)); + /// + /// a valid connection string for a OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an array of SqlParamters used to execute the command + /// a dataset containing the resultset generated by the command + public static DataSet ExecuteDataset(string connectionString, CommandType commandType, string commandText, params OracleParameter[] commandParameters) + { + //create & open a OracleConnection, and dispose of it after we are done. + using (OracleConnection cn = new OracleConnection(connectionString)) + { + cn.Open(); + + //call the overload that takes a connection in place of the connection string + return ExecuteDataset(cn, commandType, commandText, commandParameters); + } + } + + /// + /// Execute a stored procedure via a SqlCommand (that returns a resultset) against the database specified in + /// the connection string using the provided parameter values. This method will query the database to discover the parameters for the + /// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. + /// + /// + /// This method provides no access to output parameters or the stored procedure's return value parameter. + /// + /// e.g.: + /// DataSet ds = ExecuteDataset(connString, "GetOrders", 24, 36); + /// + /// a valid connection string for a OracleConnection + /// the name of the stored procedure + /// an array of objects to be assigned as the input values of the stored procedure + /// a dataset containing the resultset generated by the command + public static DataSet ExecuteDataset(string connectionString, string spName, params object[] parameterValues) + { + //if we receive parameter values, we need to figure out where they go + if ((parameterValues != null) && (parameterValues.Length > 0)) + { + //pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache) + OracleParameter[] commandParameters = OracleHelperParameterCache.GetSpParameterSet(connectionString, spName); + + //assign the provided values to these parameters based on parameter order + AssignParameterValues(commandParameters, parameterValues); + + //call the overload that takes an array of SqlParameters + return ExecuteDataset(connectionString, CommandType.StoredProcedure, spName, commandParameters); + } + //otherwise we can just call the SP without params + return ExecuteDataset(connectionString, CommandType.StoredProcedure, spName); + } + + /// + /// Execute a SqlCommand (that returns a resultset and takes no parameters) against the provided OracleConnection. + /// + /// + /// e.g.: + /// DataSet ds = ExecuteDataset(conn, CommandType.StoredProcedure, "GetOrders"); + /// + /// a valid OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// a dataset containing the resultset generated by the command + public static DataSet ExecuteDataset(OracleConnection connection, CommandType commandType, string commandText) + { + //pass through the call providing null for the set of SqlParameters + return ExecuteDataset(connection, commandType, commandText, null); + } + + /// + /// Execute a SqlCommand (that returns a resultset) against the specified OracleConnection + /// using the provided parameters. + /// + /// + /// e.g.: + /// DataSet ds = ExecuteDataset(conn, CommandType.StoredProcedure, "GetOrders", new OracleParameter("@prodid", 24)); + /// + /// a valid OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an array of SqlParamters used to execute the command + /// a dataset containing the resultset generated by the command + public static DataSet ExecuteDataset(OracleConnection connection, CommandType commandType, string commandText, params OracleParameter[] commandParameters) + { + //create a command and prepare it for execution + OracleCommand cmd = new OracleCommand(); + PrepareCommand(cmd, connection, null, commandType, commandText, commandParameters); + + //create the DataAdapter & DataSet + OracleDataAdapter da = new OracleDataAdapter(cmd); + DataSet ds = new DataSet(); + + //fill the DataSet using default values for DataTable names, etc. + da.Fill(ds); + + // detach the SqlParameters from the command object, so they can be used again. + cmd.Parameters.Clear(); + + //return the dataset + return ds; + } + + /// + /// Execute a stored procedure via a SqlCommand (that returns a resultset) against the specified OracleConnection + /// using the provided parameter values. This method will query the database to discover the parameters for the + /// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. + /// + /// + /// This method provides no access to output parameters or the stored procedure's return value parameter. + /// + /// e.g.: + /// DataSet ds = ExecuteDataset(conn, "GetOrders", 24, 36); + /// + /// a valid OracleConnection + /// the name of the stored procedure + /// an array of objects to be assigned as the input values of the stored procedure + /// a dataset containing the resultset generated by the command + public static DataSet ExecuteDataset(OracleConnection connection, string spName, params object[] parameterValues) + { + //if we receive parameter values, we need to figure out where they go + if ((parameterValues != null) && (parameterValues.Length > 0)) + { + //pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache) + OracleParameter[] commandParameters = OracleHelperParameterCache.GetSpParameterSet(connection.ConnectionString, spName); + + //assign the provided values to these parameters based on parameter order + AssignParameterValues(commandParameters, parameterValues); + + //call the overload that takes an array of SqlParameters + return ExecuteDataset(connection, CommandType.StoredProcedure, spName, commandParameters); + } + //otherwise we can just call the SP without params + return ExecuteDataset(connection, CommandType.StoredProcedure, spName); + } + + /// + /// Execute a SqlCommand (that returns a resultset and takes no parameters) against the provided OracleTransaction. + /// + /// + /// e.g.: + /// DataSet ds = ExecuteDataset(trans, CommandType.StoredProcedure, "GetOrders"); + /// + /// a valid OracleTransaction + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// a dataset containing the resultset generated by the command + public static DataSet ExecuteDataset(OracleTransaction transaction, CommandType commandType, string commandText) + { + //pass through the call providing null for the set of SqlParameters + return ExecuteDataset(transaction, commandType, commandText, null); + } + + /// + /// Execute a SqlCommand (that returns a resultset) against the specified OracleTransaction + /// using the provided parameters. + /// + /// + /// e.g.: + /// DataSet ds = ExecuteDataset(trans, CommandType.StoredProcedure, "GetOrders", new OracleParameter("@prodid", 24)); + /// + /// a valid OracleTransaction + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an array of SqlParamters used to execute the command + /// a dataset containing the resultset generated by the command + public static DataSet ExecuteDataset(OracleTransaction transaction, CommandType commandType, string commandText, params OracleParameter[] commandParameters) + { + //create a command and prepare it for execution + OracleCommand cmd = new OracleCommand(); + PrepareCommand(cmd, transaction.Connection, transaction, commandType, commandText, commandParameters); + + //create the DataAdapter & DataSet + OracleDataAdapter da = new OracleDataAdapter(cmd); + DataSet ds = new DataSet(); + + //fill the DataSet using default values for DataTable names, etc. + da.Fill(ds); + + // detach the SqlParameters from the command object, so they can be used again. + cmd.Parameters.Clear(); + + //return the dataset + return ds; + } + + /// + /// Execute a stored procedure via a SqlCommand (that returns a resultset) against the specified + /// OracleTransaction using the provided parameter values. This method will query the database to discover the parameters for the + /// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. + /// + /// + /// This method provides no access to output parameters or the stored procedure's return value parameter. + /// + /// e.g.: + /// DataSet ds = ExecuteDataset(trans, "GetOrders", 24, 36); + /// + /// a valid OracleTransaction + /// the name of the stored procedure + /// an array of objects to be assigned as the input values of the stored procedure + /// a dataset containing the resultset generated by the command + public static DataSet ExecuteDataset(OracleTransaction transaction, string spName, params object[] parameterValues) + { + //if we receive parameter values, we need to figure out where they go + if ((parameterValues != null) && (parameterValues.Length > 0)) + { + //pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache) + OracleParameter[] commandParameters = OracleHelperParameterCache.GetSpParameterSet(transaction.Connection.ConnectionString, spName); + + //assign the provided values to these parameters based on parameter order + AssignParameterValues(commandParameters, parameterValues); + + //call the overload that takes an array of SqlParameters + return ExecuteDataset(transaction, CommandType.StoredProcedure, spName, commandParameters); + } + //otherwise we can just call the SP without params + return ExecuteDataset(transaction, CommandType.StoredProcedure, spName); + } + + #endregion ExecuteDataSet + + #region ExecuteReader + + /// + /// this enum is used to indicate whether the connection was provided by the caller, or created by SqlHelper, so that + /// we can set the appropriate CommandBehavior when calling ExecuteReader() + /// + private enum OracleConnectionOwnership + { + /// Connection is owned and managed by SqlHelper + Internal, + /// Connection is owned and managed by the caller + External + } + + /// + /// Create and prepare a SqlCommand, and call ExecuteReader with the appropriate CommandBehavior. + /// + /// + /// If we created and opened the connection, we want the connection to be closed when the DataReader is closed. + /// + /// If the caller provided the connection, we want to leave it to them to manage. + /// + /// a valid OracleConnection, on which to execute this command + /// a valid OracleTransaction, or 'null' + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an array of SqlParameters to be associated with the command or 'null' if no parameters are required + /// indicates whether the connection parameter was provided by the caller, or created by SqlHelper + /// SqlDataReader containing the results of the command + private static OracleDataReader ExecuteReader(OracleConnection connection, OracleTransaction transaction, CommandType commandType, string commandText, OracleParameter[] commandParameters, OracleConnectionOwnership connectionOwnership) + { + //create a command and prepare it for execution + OracleCommand cmd = new OracleCommand(); + PrepareCommand(cmd, connection, transaction, commandType, commandText, commandParameters); + + //create a reader + OracleDataReader dr; + + // call ExecuteReader with the appropriate CommandBehavior + if (connectionOwnership == OracleConnectionOwnership.External) + { + dr = cmd.ExecuteReader(); + } + else + { + dr = cmd.ExecuteReader(CommandBehavior.CloseConnection); + + } + + // detach the SqlParameters from the command object, so they can be used again. + cmd.Parameters.Clear(); + + return dr; + } + + /// + /// Execute a SqlCommand (that returns a resultset and takes no parameters) against the database specified in + /// the connection string. + /// + /// + /// e.g.: + /// SqlDataReader dr = ExecuteReader(connString, CommandType.StoredProcedure, "GetOrders"); + /// + /// a valid connection string for a OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// a SqlDataReader containing the resultset generated by the command + public static OracleDataReader ExecuteReader(string connectionString, CommandType commandType, string commandText) + { + //pass through the call providing null for the set of SqlParameters + return ExecuteReader(connectionString, commandType, commandText, null); + } + + /// + /// Execute a SqlCommand (that returns a resultset) against the database specified in the connection string + /// using the provided parameters. + /// + /// + /// e.g.: + /// SqlDataReader dr = ExecuteReader(connString, CommandType.StoredProcedure, "GetOrders", new OracleParameter("@prodid", 24)); + /// + /// a valid connection string for a OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an array of SqlParamters used to execute the command + /// a SqlDataReader containing the resultset generated by the command + public static OracleDataReader ExecuteReader(string connectionString, CommandType commandType, string commandText, params OracleParameter[] commandParameters) + { + //create & open a OracleConnection + OracleConnection cn = new OracleConnection(connectionString); + cn.Open(); + + try + { + //call the private overload that takes an internally owned connection in place of the connection string + return ExecuteReader(cn, null, commandType, commandText, commandParameters, OracleConnectionOwnership.Internal); + } + catch + { + //if we fail to return the SqlDatReader, we need to close the connection ourselves + cn.Close(); + throw; + } + } + + /// + /// Execute a stored procedure via a SqlCommand (that returns a resultset) against the database specified in + /// the connection string using the provided parameter values. This method will query the database to discover the parameters for the + /// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. + /// + /// + /// This method provides no access to output parameters or the stored procedure's return value parameter. + /// + /// e.g.: + /// SqlDataReader dr = ExecuteReader(connString, "GetOrders", 24, 36); + /// + /// a valid connection string for a OracleConnection + /// the name of the stored procedure + /// an array of objects to be assigned as the input values of the stored procedure + /// a SqlDataReader containing the resultset generated by the command + public static OracleDataReader ExecuteReader(string connectionString, string spName, params object[] parameterValues) + { + //if we receive parameter values, we need to figure out where they go + if ((parameterValues != null) && (parameterValues.Length > 0)) + { + //pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache) + OracleParameter[] commandParameters = OracleHelperParameterCache.GetSpParameterSet(connectionString, spName); + + //assign the provided values to these parameters based on parameter order + AssignParameterValues(commandParameters, parameterValues); + + //call the overload that takes an array of SqlParameters + return ExecuteReader(connectionString, CommandType.StoredProcedure, spName, commandParameters); + } + //otherwise we can just call the SP without params + return ExecuteReader(connectionString, CommandType.StoredProcedure, spName); + } + + /// + /// Execute a SqlCommand (that returns a resultset and takes no parameters) against the provided OracleConnection. + /// + /// + /// e.g.: + /// SqlDataReader dr = ExecuteReader(conn, CommandType.StoredProcedure, "GetOrders"); + /// + /// a valid OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// a SqlDataReader containing the resultset generated by the command + public static OracleDataReader ExecuteReader(OracleConnection connection, CommandType commandType, string commandText) + { + //pass through the call providing null for the set of SqlParameters + return ExecuteReader(connection, commandType, commandText, null); + } + + /// + /// Execute a SqlCommand (that returns a resultset) against the specified OracleConnection + /// using the provided parameters. + /// + /// + /// e.g.: + /// SqlDataReader dr = ExecuteReader(conn, CommandType.StoredProcedure, "GetOrders", new OracleParameter("@prodid", 24)); + /// + /// a valid OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an array of SqlParamters used to execute the command + /// a SqlDataReader containing the resultset generated by the command + public static OracleDataReader ExecuteReader(OracleConnection connection, CommandType commandType, string commandText, params OracleParameter[] commandParameters) + { + //pass through the call to the private overload using a null transaction value and an externally owned connection + return ExecuteReader(connection, null, commandType, commandText, commandParameters, OracleConnectionOwnership.External); + } + + /// + /// Execute a stored procedure via a SqlCommand (that returns a resultset) against the specified OracleConnection + /// using the provided parameter values. This method will query the database to discover the parameters for the + /// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. + /// + /// + /// This method provides no access to output parameters or the stored procedure's return value parameter. + /// + /// e.g.: + /// SqlDataReader dr = ExecuteReader(conn, "GetOrders", 24, 36); + /// + /// a valid OracleConnection + /// the name of the stored procedure + /// an array of objects to be assigned as the input values of the stored procedure + /// a SqlDataReader containing the resultset generated by the command + public static OracleDataReader ExecuteReader(OracleConnection connection, string spName, params object[] parameterValues) + { + //if we receive parameter values, we need to figure out where they go + if ((parameterValues != null) && (parameterValues.Length > 0)) + { + OracleParameter[] commandParameters = OracleHelperParameterCache.GetSpParameterSet(connection.ConnectionString, spName); + + AssignParameterValues(commandParameters, parameterValues); + + return ExecuteReader(connection, CommandType.StoredProcedure, spName, commandParameters); + } + //otherwise we can just call the SP without params + return ExecuteReader(connection, CommandType.StoredProcedure, spName); + } + + /// + /// Execute a SqlCommand (that returns a resultset and takes no parameters) against the provided OracleTransaction. + /// + /// + /// e.g.: + /// SqlDataReader dr = ExecuteReader(trans, CommandType.StoredProcedure, "GetOrders"); + /// + /// a valid OracleTransaction + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// a SqlDataReader containing the resultset generated by the command + public static OracleDataReader ExecuteReader(OracleTransaction transaction, CommandType commandType, string commandText) + { + //pass through the call providing null for the set of SqlParameters + return ExecuteReader(transaction, commandType, commandText, null); + } + + /// + /// Execute a SqlCommand (that returns a resultset) against the specified OracleTransaction + /// using the provided parameters. + /// + /// + /// e.g.: + /// SqlDataReader dr = ExecuteReader(trans, CommandType.StoredProcedure, "GetOrders", new OracleParameter("@prodid", 24)); + /// + /// a valid OracleTransaction + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an array of SqlParamters used to execute the command + /// a SqlDataReader containing the resultset generated by the command + public static OracleDataReader ExecuteReader(OracleTransaction transaction, CommandType commandType, string commandText, params OracleParameter[] commandParameters) + { + //pass through to private overload, indicating that the connection is owned by the caller + return ExecuteReader(transaction.Connection, transaction, commandType, commandText, commandParameters, OracleConnectionOwnership.External); + } + + /// + /// Execute a stored procedure via a SqlCommand (that returns a resultset) against the specified + /// OracleTransaction using the provided parameter values. This method will query the database to discover the parameters for the + /// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. + /// + /// + /// This method provides no access to output parameters or the stored procedure's return value parameter. + /// + /// e.g.: + /// SqlDataReader dr = ExecuteReader(trans, "GetOrders", 24, 36); + /// + /// a valid OracleTransaction + /// the name of the stored procedure + /// an array of objects to be assigned as the input values of the stored procedure + /// a SqlDataReader containing the resultset generated by the command + public static OracleDataReader ExecuteReader(OracleTransaction transaction, string spName, params object[] parameterValues) + { + //if we receive parameter values, we need to figure out where they go + if ((parameterValues != null) && (parameterValues.Length > 0)) + { + OracleParameter[] commandParameters = OracleHelperParameterCache.GetSpParameterSet(transaction.Connection.ConnectionString, spName); + + AssignParameterValues(commandParameters, parameterValues); + + return ExecuteReader(transaction, CommandType.StoredProcedure, spName, commandParameters); + } + //otherwise we can just call the SP without params + return ExecuteReader(transaction, CommandType.StoredProcedure, spName); + } + + #endregion ExecuteReader + + #region ExecuteScalar + + /// + /// Execute a OracleCommand (that returns a 1x1 resultset and takes no parameters) against the database specified in + /// the connection string. + /// + /// + /// e.g.: + /// int orderCount = (int)ExecuteScalar(connString, CommandType.StoredProcedure, "GetOrderCount"); + /// + /// a valid connection string for a OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an object containing the value in the 1x1 resultset generated by the command + public static object ExecuteScalar(string connectionString, CommandType commandType, string commandText) + { + //pass through the call providing null for the set of SqlParameters + return ExecuteScalar(connectionString, commandType, commandText, null); + } + + /// + /// Execute a OracleCommand (that returns a 1x1 resultset) against the database specified in the connection string + /// using the provided parameters. + /// + /// + /// e.g.: + /// int orderCount = (int)ExecuteScalar(connString, CommandType.StoredProcedure, "GetOrderCount", new OracleParameter("@prodid", 24)); + /// + /// a valid connection string for a OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an array of SqlParamters used to execute the command + /// an object containing the value in the 1x1 resultset generated by the command + public static object ExecuteScalar(string connectionString, CommandType commandType, string commandText, params OracleParameter[] commandParameters) + { + //create & open a OracleConnection, and dispose of it after we are done. + using (OracleConnection cn = new OracleConnection(connectionString)) + { + cn.Open(); + + //call the overload that takes a connection in place of the connection string + return ExecuteScalar(cn, commandType, commandText, commandParameters); + } + } + + /// + /// Execute a stored procedure via a OracleCommand (that returns a 1x1 resultset) against the database specified in + /// the connection string using the provided parameter values. This method will query the database to discover the parameters for the + /// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. + /// + /// + /// This method provides no access to output parameters or the stored procedure's return value parameter. + /// + /// e.g.: + /// int orderCount = (int)ExecuteScalar(connString, "GetOrderCount", 24, 36); + /// + /// a valid connection string for a OracleConnection + /// the name of the stored procedure + /// an array of objects to be assigned as the input values of the stored procedure + /// an object containing the value in the 1x1 resultset generated by the command + public static object ExecuteScalar(string connectionString, string spName, params object[] parameterValues) + { + //if we receive parameter values, we need to figure out where they go + if ((parameterValues != null) && (parameterValues.Length > 0)) + { + //pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache) + OracleParameter[] commandParameters = OracleHelperParameterCache.GetSpParameterSet(connectionString, spName); + + //assign the provided values to these parameters based on parameter order + AssignParameterValues(commandParameters, parameterValues); + + //call the overload that takes an array of SqlParameters + return ExecuteScalar(connectionString, CommandType.StoredProcedure, spName, commandParameters); + } + //otherwise we can just call the SP without params + return ExecuteScalar(connectionString, CommandType.StoredProcedure, spName); + } + + /// + /// Execute a OracleCommand (that returns a 1x1 resultset and takes no parameters) against the provided OracleConnection. + /// + /// + /// e.g.: + /// int orderCount = (int)ExecuteScalar(conn, CommandType.StoredProcedure, "GetOrderCount"); + /// + /// a valid OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an object containing the value in the 1x1 resultset generated by the command + public static object ExecuteScalar(OracleConnection connection, CommandType commandType, string commandText) + { + //pass through the call providing null for the set of SqlParameters + return ExecuteScalar(connection, commandType, commandText, null); + } + + /// + /// Execute a OracleCommand (that returns a 1x1 resultset) against the specified OracleConnection + /// using the provided parameters. + /// + /// + /// e.g.: + /// int orderCount = (int)ExecuteScalar(conn, CommandType.StoredProcedure, "GetOrderCount", new OracleParameter("@prodid", 24)); + /// + /// a valid OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an array of SqlParamters used to execute the command + /// an object containing the value in the 1x1 resultset generated by the command + public static object ExecuteScalar(OracleConnection connection, CommandType commandType, string commandText, params OracleParameter[] commandParameters) + { + //create a command and prepare it for execution + OracleCommand cmd = new OracleCommand(); + PrepareCommand(cmd, connection, null, commandType, commandText, commandParameters); + + //execute the command & return the results + object retval = cmd.ExecuteScalar(); + + // detach the SqlParameters from the command object, so they can be used again. + cmd.Parameters.Clear(); + return retval; + + } + + /// + /// Execute a stored procedure via a OracleCommand (that returns a 1x1 resultset) against the specified OracleConnection + /// using the provided parameter values. This method will query the database to discover the parameters for the + /// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. + /// + /// + /// This method provides no access to output parameters or the stored procedure's return value parameter. + /// + /// e.g.: + /// int orderCount = (int)ExecuteScalar(conn, "GetOrderCount", 24, 36); + /// + /// a valid OracleConnection + /// the name of the stored procedure + /// an array of objects to be assigned as the input values of the stored procedure + /// an object containing the value in the 1x1 resultset generated by the command + public static object ExecuteScalar(OracleConnection connection, string spName, params object[] parameterValues) + { + //if we receive parameter values, we need to figure out where they go + if ((parameterValues != null) && (parameterValues.Length > 0)) + { + //pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache) + OracleParameter[] commandParameters = OracleHelperParameterCache.GetSpParameterSet(connection.ConnectionString, spName); + + //assign the provided values to these parameters based on parameter order + AssignParameterValues(commandParameters, parameterValues); + + //call the overload that takes an array of SqlParameters + return ExecuteScalar(connection, CommandType.StoredProcedure, spName, commandParameters); + } + //otherwise we can just call the SP without params + return ExecuteScalar(connection, CommandType.StoredProcedure, spName); + } + + /// + /// Execute a OracleCommand (that returns a 1x1 resultset and takes no parameters) against the provided OracleTransaction. + /// + /// + /// e.g.: + /// int orderCount = (int)ExecuteScalar(trans, CommandType.StoredProcedure, "GetOrderCount"); + /// + /// a valid OracleTransaction + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an object containing the value in the 1x1 resultset generated by the command + public static object ExecuteScalar(OracleTransaction transaction, CommandType commandType, string commandText) + { + //pass through the call providing null for the set of SqlParameters + return ExecuteScalar(transaction, commandType, commandText, null); + } + + /// + /// Execute a OracleCommand (that returns a 1x1 resultset) against the specified OracleTransaction + /// using the provided parameters. + /// + /// + /// e.g.: + /// int orderCount = (int)ExecuteScalar(trans, CommandType.StoredProcedure, "GetOrderCount", new OracleParameter("@prodid", 24)); + /// + /// a valid OracleTransaction + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an array of SqlParamters used to execute the command + /// an object containing the value in the 1x1 resultset generated by the command + public static object ExecuteScalar(OracleTransaction transaction, CommandType commandType, string commandText, params OracleParameter[] commandParameters) + { + //create a command and prepare it for execution + OracleCommand cmd = new OracleCommand(); + PrepareCommand(cmd, transaction.Connection, transaction, commandType, commandText, commandParameters); + + //execute the command & return the results + object retval = cmd.ExecuteScalar(); + + // detach the SqlParameters from the command object, so they can be used again. + cmd.Parameters.Clear(); + return retval; + } + + /// + /// Execute a stored procedure via a OracleCommand (that returns a 1x1 resultset) against the specified + /// OracleTransaction using the provided parameter values. This method will query the database to discover the parameters for the + /// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. + /// + /// + /// This method provides no access to output parameters or the stored procedure's return value parameter. + /// + /// e.g.: + /// int orderCount = (int)ExecuteScalar(trans, "GetOrderCount", 24, 36); + /// + /// a valid OracleTransaction + /// the name of the stored procedure + /// an array of objects to be assigned as the input values of the stored procedure + /// an object containing the value in the 1x1 resultset generated by the command + public static object ExecuteScalar(OracleTransaction transaction, string spName, params object[] parameterValues) + { + //if we receive parameter values, we need to figure out where they go + if ((parameterValues != null) && (parameterValues.Length > 0)) + { + //pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache) + OracleParameter[] commandParameters = OracleHelperParameterCache.GetSpParameterSet(transaction.Connection.ConnectionString, spName); + + //assign the provided values to these parameters based on parameter order + AssignParameterValues(commandParameters, parameterValues); + + //call the overload that takes an array of SqlParameters + return ExecuteScalar(transaction, CommandType.StoredProcedure, spName, commandParameters); + } + //otherwise we can just call the SP without params + return ExecuteScalar(transaction, CommandType.StoredProcedure, spName); + } + + #endregion ExecuteScalar + + + } + /// + /// OracleHelperParameterCache provides functions to leverage a static cache of procedure parameters, and the + /// ability to discover parameters for stored procedures at run-time. + /// + /// + + public sealed class OracleHelperParameterCache + { + #region private methods, variables, and constructors + + //Since this class provides only static methods, make the default constructor private to prevent + //instances from being created with "new SqlHelperParameterCache()". + private OracleHelperParameterCache() { } + + private static Hashtable paramCache = Hashtable.Synchronized(new Hashtable()); + + /// + /// resolve at run time the appropriate set of SqlParameters for a stored procedure + /// + /// a valid connection string for a OracleConnection + /// the name of the stored procedure + /// whether or not to include their return value parameter + /// + private static OracleParameter[] DiscoverSpParameterSet(string connectionString, string spName, bool includeReturnValueParameter) + { + using (OracleConnection cn = new OracleConnection(connectionString)) + using (OracleCommand cmd = new OracleCommand(spName, cn)) + { + cn.Open(); + cmd.CommandType = CommandType.StoredProcedure; + OracleCommandBuilder.DeriveParameters(cmd); + + if (!includeReturnValueParameter) + { + cmd.Parameters.RemoveAt(0); + } + + OracleParameter[] discoveredParameters = new OracleParameter[cmd.Parameters.Count]; ; + + cmd.Parameters.CopyTo(discoveredParameters, 0); + + return discoveredParameters; + } + } + + //deep copy of cached OracleParameter array + private static OracleParameter[] CloneParameters(OracleParameter[] originalParameters) + { + OracleParameter[] clonedParameters = new OracleParameter[originalParameters.Length]; + + for (int i = 0, j = originalParameters.Length; i < j; i++) + { + clonedParameters[i] = (OracleParameter)((ICloneable)originalParameters[i]).Clone(); + } + + return clonedParameters; + } + + #endregion private methods, variables, and constructors + + #region caching functions + + /// + /// add parameter array to the cache + /// + /// a valid connection string for a OracleConnection + /// the stored procedure name or T-SQL command + /// an array of SqlParamters to be cached + public static void CacheParameterSet(string connectionString, string commandText, params OracleParameter[] commandParameters) + { + string hashKey = connectionString + ":" + commandText; + + paramCache[hashKey] = commandParameters; + } + + /// + /// retrieve a parameter array from the cache + /// + /// a valid connection string for a OracleConnection + /// the stored procedure name or T-SQL command + /// an array of SqlParamters + public static OracleParameter[] GetCachedParameterSet(string connectionString, string commandText) + { + string hashKey = connectionString + ":" + commandText; + + OracleParameter[] cachedParameters = (OracleParameter[])paramCache[hashKey]; + + if (cachedParameters == null) + { + return null; + } + return CloneParameters(cachedParameters); + } + + #endregion caching functions + + #region Parameter Discovery Functions + + /// + /// Retrieves the set of SqlParameters appropriate for the stored procedure + /// + /// + /// This method will query the database for this information, and then store it in a cache for future requests. + /// + /// a valid connection string for a OracleConnection + /// the name of the stored procedure + /// an array of SqlParameters + public static OracleParameter[] GetSpParameterSet(string connectionString, string spName) + { + return GetSpParameterSet(connectionString, spName, false); + } + + /// + /// Retrieves the set of SqlParameters appropriate for the stored procedure + /// + /// + /// This method will query the database for this information, and then store it in a cache for future requests. + /// + /// a valid connection string for a OracleConnection + /// the name of the stored procedure + /// a bool value indicating whether the return value parameter should be included in the results + /// an array of SqlParameters + public static OracleParameter[] GetSpParameterSet(string connectionString, string spName, bool includeReturnValueParameter) + { + string hashKey = connectionString + ":" + spName + (includeReturnValueParameter ? ":include ReturnValue Parameter" : ""); + + OracleParameter[] cachedParameters; + + cachedParameters = (OracleParameter[])paramCache[hashKey]; + + if (cachedParameters == null) + { + cachedParameters = (OracleParameter[])(paramCache[hashKey] = DiscoverSpParameterSet(connectionString, spName, includeReturnValueParameter)); + } + + return CloneParameters(cachedParameters); + } + + #endregion Parameter Discovery Functions + } +} diff --git a/Utility.cs b/Utility.cs index 1429fd9..4e64d66 100644 --- a/Utility.cs +++ b/Utility.cs @@ -17,6 +17,11 @@ { public class Utility { + public static string DBServer; + public static string Database; + public static string UserID; + public static string DBPassword; + public static void SetBallons(GSOBalloon featureTooltip,GSOBalloonEx balloonEx) { featureTooltip.CacheFilePath = Path.GetDirectoryName(Application.ExecutablePath) + "/GeoScene/Globe/Temp"; diff --git a/bin/x64/Debug/LSPipeline.exe b/bin/x64/Debug/LSPipeline.exe index 833a5e5..76f838b 100644 --- a/bin/x64/Debug/LSPipeline.exe +++ b/bin/x64/Debug/LSPipeline.exe Binary files differ diff --git a/FrmDatabaseParaSettingOracle.cs b/FrmDatabaseParaSettingOracle.cs index 18c5e99..6e97dfb 100644 --- a/FrmDatabaseParaSettingOracle.cs +++ b/FrmDatabaseParaSettingOracle.cs @@ -47,12 +47,15 @@ } string serverIp = textBoxIP.Text.Trim(); + /* string hostName = System.Net.Dns.GetHostName(); if (serverIp == hostName || serverIp == "localhost" || serverIp == System.Net.Dns.GetHostAddresses(hostName).GetValue(2).ToString()) { serverIp = "127.0.0.1"; } + * */ + DateTime timeStart = DateTime.Now; GSODataSource ds = globeControl1.Globe.DataManager.GetDataSourceByName(serverIp + "/" + textBoxDatabase.Text.Trim() + "_" + textBoxUser.Text.Trim()); if (ds == null) @@ -83,7 +86,7 @@ connectParams.dataSourceName = ds.Name; connectParams.databaseType = EnumDataSourceType.Oracle; Utility.connectParamsOfDatabase.Add(connectParams); - + setUtilityValue(connectParams); WriteXML(); MessageBox.Show("连接Oracle数据库成功,用时:" + secondsConnectOracle.ToString() + "秒", "提示"); } @@ -92,6 +95,14 @@ this.Close(); } + private void setUtilityValue(DatabaseConnectParams connectParams) + { + Utility.DBServer = connectParams.ip; + Utility.Database = connectParams.databaseName; + Utility.UserID = connectParams.userName; + Utility.DBPassword = connectParams.password; + } + private void ReadXML() { string strFileName = Path.GetDirectoryName(Application.ExecutablePath) + "/databaseConfigOracle.xml"; diff --git a/GXBuilder.cs b/GXBuilder.cs new file mode 100644 index 0000000..b2ec9b2 --- /dev/null +++ b/GXBuilder.cs @@ -0,0 +1,187 @@ +using System; +using System.Data; +using System.Drawing; +using System.Runtime.InteropServices; +using GeoScene.Data; +using GeoScene.Engine; +using GeoScene.Globe; + +namespace WorldGIS +{ + public class GXBuilder : ModelBuilder + { + private static double diameter = 0.1; + + public GXBuilder(GSODataSource ds) + : base(ds) + { + + } + + public override bool validate(GSOLayer layer) + { + return true; + } + + /// + /// + /// + /// 追加或修改 + /// 高程入库或埋深入库 + /// + public override bool doBuild(EnumUpdateMode updateMode, + EnumBuildMode buildMode, + BaseParam param) + { + LineParam lineParam = param as LineParam; + GSOFeatureDataset newFeatureSet = ds.GetDatasetByName(lineParam.layerName) as GSOFeatureDataset; + if (newFeatureSet == null) + { + newFeatureSet = CreateDBFeatureDataset(layer, lineParam.layerName); + } + newFeatureSet.Open(); + GSOFeatures features = layer.GetAllFeatures(true); + for (int i = 0; i < features.Length; i++) + { + GSOFeature f = features[i]; + GSOGeoPolyline3D lineeee = f.Geometry as GSOGeoPolyline3D; + if (lineeee == null || lineeee.GetSpaceLength(true, 6378137) == 0) + { + LogHelper.Error("出现数据无法入库:" + f.ID); + continue; + } + + GSOFeature newFeature = newFeatureSet.CreateFeature(); + + double radius = diameter; //创建光纤的半径 + newFeature.Geometry = updateGemotry(f, lineParam, radius, buildMode); + newFeature.Geometry.Style = getPipeLineStyle(lineParam, f, radius); + newFeature.Name = f.GetFieldAsString(lineParam.uniqueIdFieldName); + setFeatureValueByShapeFeature(f, newFeature); + // newFeatureSet + if (newFeatureSet.GetFeatureByName(newFeature.Name, true).Length > 0) + { + if (!this.UpdateGXDevice(newFeatureSet.GetFeatureByName(newFeature.Name, true)[0], + newFeature)) + { + LogHelper.Error("光纤设备更新失败:" + newFeature.Name+"\r\n"); + } + continue; + } + newFeatureSet.AddFeature(newFeature); + if (!AddGXDevice(newFeature)) + { + LogHelper.Error("光纤数据保存Alarm_Device失败:" + newFeature.Name+"\r\n"); + } + } + newFeatureSet.Save(); + newFeatureSet.Close(); + return true; + } + + private bool AddGXDevice(GSOFeature feature) + { + //保存数据到设备表 + try + { + String deviceType = feature.GetValue("DEVICETYPE") == null + ? "" : feature.GetValue("DEVICETYPE").ToString(); + String devCode = feature.GetValue("DEVICEID") == null + ? "" : feature.GetValue("DEVICEID").ToString(); + String road = feature.GetValue("ROAD") == null + ? "" : feature.GetValue("ROAD").ToString(); + + //TODO LIST: + string sqlCount = "select dbid from alarm_device_type where" + + " typename = '" + deviceType + "'"; + object dbid = OracleUtils.ExecuteScalar(OracleUtils.ConnectionString, + CommandType.Text, sqlCount); + if (dbid == null) + { + return false; + } + int deviceTypeId = int.Parse(dbid.ToString()); + string sql = "Insert into alarm_device (DBID,ACTIVE,DEVCODE,DEVNAME,FACTORY," + + "INSTALLDATE,GAOCHENG,HEIGHT,LATITUDE,LONGTITUDE,DEVICETYPE_ID) " + + "values (SEQ_DEVICE_ID.NEXTVAL, 1, '" + devCode + "', '" + deviceType + devCode + + "', " + "'航天二院', " + "to_date('" + DateTime.Now.ToString() + "','yyyy/MM/dd hh24:mi::ss'), " + + "0, 0, 0, 0, " + deviceTypeId + ")"; + OracleUtils.ExecuteNonQuery(OracleUtils.ConnectionString, CommandType.Text, sql); + + } + catch (Exception e) + { + throw; + } + return true; + } + + private bool UpdateGXDevice(GSOFeature feature, GSOFeature newFeature) + { + String deviceType = newFeature.GetValue("DEVICETYPE") == null + ? "" : newFeature.GetValue("DEVICETYPE").ToString(); + String devCode = newFeature.GetValue("DEVICEID") == null + ? "" : newFeature.GetValue("DEVICEID").ToString(); + String road = newFeature.GetValue("ROAD") == null + ? "" : newFeature.GetValue("ROAD").ToString(); + + feature.Geometry = newFeature.Geometry.Clone(); + this.setFeatureValueByShapeFeature(newFeature,feature); + // feature.Dataset.Save(); + + string sqlCount = "select dbid from alarm_device_type where" + + " typename = '" + deviceType + "'"; + object dbid = OracleUtils.ExecuteScalar(OracleUtils.ConnectionString, + CommandType.Text, sqlCount); + if (dbid == null) + { + return false; + } + int deviceTypeId = int.Parse(dbid.ToString()); + + string sql = "update alarm_device set FACTORY='" + road + + "', DEVICETYPE_ID='" + deviceTypeId + + "', DEVNAME='"+deviceType+devCode+"' "+ + "where devcode='" + devCode + "'"; + OracleUtils.ExecuteNonQuery(OracleUtils.ConnectionString, CommandType.Text, sql); + return true; + } + + private GSOLineStyle3D getPipeLineStyle(LineParam lineParam, GSOFeature f, double radius) + { + GSOPipeLineStyle3D style0 = new GSOPipeLineStyle3D(); + style0.LineColor = Color.FromArgb(lineParam.transparency, lineParam.lineColor); + style0.Slice = lineParam.sliceNum; + style0.CornerSliceAngle = lineParam.cornerSliceAngle; + style0.Radius = radius; + return style0; + } + + private GSOGeometry updateGemotry(GSOFeature f, LineParam lineParam, double radius, EnumBuildMode buildMode) + { + + f.Geometry.AltitudeMode = (buildMode.Equals(EnumBuildMode.Alititude)) ? EnumAltitudeMode.RelativeToGround : EnumAltitudeMode.Absolute; + + GSOGeoPolyline3D line = f.Geometry as GSOGeoPolyline3D; + if (line == null) + { + return null; //log4net 记录错误处理 + } + + double deep1 = 0; + double deep2 = 0; + + GSOPoint3ds pt3ds = new GSOPoint3ds(); + for (int n = 0; n < line[0].Count; n++) + { + GSOPoint3d pt3d = line[0][n]; + pt3d.Z = 0; + + pt3ds.Add(pt3d); + } + line[0] = pt3ds; + return line; + } + + } +} diff --git a/HTForms/FrmPipelineModelDataBase.cs b/HTForms/FrmPipelineModelDataBase.cs index 84a2d7b..3076bdd 100644 --- a/HTForms/FrmPipelineModelDataBase.cs +++ b/HTForms/FrmPipelineModelDataBase.cs @@ -91,6 +91,7 @@ } else datasource = ds; + if (comboBoxExLayer.Text.Trim() == "") { MessageBox.Show("请选择一个图层文件!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning); @@ -126,20 +127,12 @@ comboBoxExLayer.Text)); if (layer == null) return; - FieldValidate fieldValidate = FieldValidateFactory.Create(ValidateConfig.LoadConfig(), - getEnumValidateType()); - - if (!fieldValidate.Validate(layer)) + if (txtModelLayer.Text != "传感设备图层") { - DateTime dt=DateTime.Now; - string logFilePath = Application.StartupPath + "\\log\\" + dt.Year + "\\" + dt.Year + dt.Month + "\\" + dt.Year + - dt.Month + dt.Day + ".txt"; - MessageBox.Show("选择的数据不符合数据规范,详情见日志" + logFilePath, "提示"); - return; + if (!getValidateResult(layer)) + return; } - ModelBuilder lineBuilder = new LineBuilder(datasource); - LineParam lineParam = new LineParam(); lineParam.layerName = txtModelLayer.Text; lineParam.uniqueIdFieldName = cmbID.Text; @@ -149,14 +142,17 @@ lineParam.diameterFieldName = cmbRadius.Text; lineParam.relativeMode = (cmbReference.Text == "管顶") ? 0 : 1; lineParam.lineColor = btnPipelineColor.BackColor; - lineParam.transparency=Convert.ToByte(ComboboxRansparency.Value); + lineParam.transparency = Convert.ToByte(ComboboxRansparency.Value); lineParam.cornerSliceAngle = Convert.ToDouble(textBoxCornerSliceAngle.Text); - lineParam.sliceNum=Convert.ToInt32(txtSlice.Text); + lineParam.sliceNum = Convert.ToInt32(txtSlice.Text); lineParam.channelWidth = comboBoxExWidth.Text; lineParam.channelHeight = comboBoxExHeight.Text; - lineBuilder.build(layer, checkBoxAdd.Checked ? EnumUpdateMode.Append : EnumUpdateMode.Update, - checkBoxDeep.Checked ? EnumBuildMode.Depth : EnumBuildMode.Alititude, lineParam); + if (txtModelLayer.Text != "传感设备图层") + lineBuilder(layer, lineParam); + else + gxLineBuilder(layer, lineParam); + addLayerToGlobeControl(lineParam.layerName); //this.DialogResult = DialogResult.OK; MessageBox.Show("入库完成!", "提示"); @@ -167,6 +163,33 @@ } } + bool getValidateResult(GSOLayer layer) + { + FieldValidate fieldValidate = FieldValidateFactory.Create(ValidateConfig.LoadConfig(), + getEnumValidateType()); + + if (fieldValidate.Validate(layer)) return true; + DateTime dt = DateTime.Now; + string logFilePath = Application.StartupPath + "\\log\\" + dt.Year + "\\" + dt.Year + dt.Month + + "\\" + dt.Year + dt.Month + dt.Day + ".txt"; + MessageBox.Show("选择的数据不符合数据规范,详情见日志" + logFilePath, "提示"); + return false; + } + + void lineBuilder(GSOLayer layer,LineParam lineParam) + { + ModelBuilder lineBuilder = new LineBuilder(datasource); + lineBuilder.build(layer, checkBoxAdd.Checked ? EnumUpdateMode.Append : EnumUpdateMode.Update, + checkBoxDeep.Checked ? EnumBuildMode.Depth : EnumBuildMode.Alititude, lineParam); + } + + void gxLineBuilder(GSOLayer layer, LineParam lineParam) + { + ModelBuilder lineBuilder = new GXBuilder(datasource); + lineBuilder.build(layer, checkBoxAdd.Checked ? EnumUpdateMode.Append : EnumUpdateMode.Update, + checkBoxDeep.Checked ? EnumBuildMode.Depth : EnumBuildMode.Alititude, lineParam); + } + private EnumValidateType getEnumValidateType() { if (comboBoxExWidth.Text != "") diff --git a/LSPipeline.csproj b/LSPipeline.csproj index 477d8ba..599b492 100644 --- a/LSPipeline.csproj +++ b/LSPipeline.csproj @@ -222,6 +222,7 @@ FrmUpdateLayerFieldValues.cs + Form @@ -243,6 +244,7 @@ + True diff --git a/LSPipeline.suo b/LSPipeline.suo index c930f27..92b5d7d 100644 --- a/LSPipeline.suo +++ b/LSPipeline.suo Binary files differ diff --git a/OracleUtils.cs b/OracleUtils.cs new file mode 100644 index 0000000..c79d316 --- /dev/null +++ b/OracleUtils.cs @@ -0,0 +1,1271 @@ +using System; +using System.Collections; +using System.Data; +using System.Data.OracleClient; + +namespace WorldGIS +{ + public abstract class OracleUtils + { + // Read the connection strings from the configuration file + //public static readonly string ConnectionString = System.Configuration.ConfigurationSettings.AppSettings["ConnectionString"]; + public static readonly string ConnectionString = @"Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=" + Utility.DBServer + + ")(PORT=1521))(CONNECT_DATA=(SID=" + Utility.Database + + ")));Persist Security Info=True;User Id=" + Utility.UserID + + "; Password=" + Utility.DBPassword + ""; + + //Create a hashtable for the parameter cached + private static Hashtable parmCache = Hashtable.Synchronized(new Hashtable()); + + #region private utility methods & constructors + + //Since this class provides only static methods, make the default constructor private to prevent + //instances from being created with "new SqlHelper()". + private OracleUtils() { } + + /// + /// This method is used to attach array of SqlParameters to a SqlCommand. + /// + /// This method will assign a value of DbNull to any parameter with a direction of + /// InputOutput and a value of null. + /// + /// This behavior will prevent default values from being used, but + /// this will be the less common case than an intended pure output parameter (derived as InputOutput) + /// where the user provided no input value. + /// + /// The command to which the parameters will be added + /// an array of SqlParameters tho be added to command + private static void AttachParameters(OracleCommand command, OracleParameter[] commandParameters) + { + foreach (OracleParameter p in commandParameters) + { + //check for derived output value with no value assigned + if ((p.Direction == ParameterDirection.InputOutput) && (p.Value == null)) + { + p.Value = DBNull.Value; + } + + command.Parameters.Add(p); + } + } + + /// + /// This method assigns an array of values to an array of SqlParameters. + /// + /// array of SqlParameters to be assigned values + /// array of objects holding the values to be assigned + private static void AssignParameterValues(OracleParameter[] commandParameters, object[] parameterValues) + { + if ((commandParameters == null) || (parameterValues == null)) + { + //do nothing if we get no data + return; + } + + // we must have the same number of values as we pave parameters to put them in + if (commandParameters.Length != parameterValues.Length) + { + throw new ArgumentException("Parameter count does not match Parameter Value count."); + } + + //iterate through the SqlParameters, assigning the values from the corresponding position in the + //value array + for (int i = 0, j = commandParameters.Length; i < j; i++) + { + commandParameters[i].Value = parameterValues[i]; + } + } + + /// + /// This method opens (if necessary) and assigns a connection, transaction, command type and parameters + /// to the provided command. + /// + /// the SqlCommand to be prepared + /// a valid OracleConnection, on which to execute this command + /// a valid OracleTransaction, or 'null' + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an array of SqlParameters to be associated with the command or 'null' if no parameters are required + private static void PrepareCommand(OracleCommand command, OracleConnection connection, OracleTransaction transaction, CommandType commandType, string commandText, OracleParameter[] commandParameters) + { + //if the provided connection is not open, we will open it + if (connection.State != ConnectionState.Open) + { + connection.Open(); + } + + //associate the connection with the command + command.Connection = connection; + + //set the command text (stored procedure name or SQL statement) + command.CommandText = commandText; + + //if we were provided a transaction, assign it. + if (transaction != null) + { + command.Transaction = transaction; + } + + //set the command type + command.CommandType = commandType; + + //attach the command parameters if they are provided + if (commandParameters != null) + { + AttachParameters(command, commandParameters); + } + } + + + #endregion private utility methods & constructors + + #region ExecuteNonQuery + + /// + /// Execute a SqlCommand (that returns no resultset and takes no parameters) against the database specified in + /// the connection string. + /// + /// + /// e.g.: + /// int result = ExecuteNonQuery(connString, CommandType.StoredProcedure, "PublishOrders"); + /// + /// a valid connection string for a OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an int representing the number of rows affected by the command + public static int ExecuteNonQuery(string connectionString, CommandType commandType, string commandText) + { + //pass through the call providing null for the set of SqlParameters + return ExecuteNonQuery(connectionString, commandType, commandText, null); + } + + /// + /// Execute a SqlCommand (that returns no resultset) against the database specified in the connection string + /// using the provided parameters. + /// + /// + /// e.g.: + /// int result = ExecuteNonQuery(connString, CommandType.StoredProcedure, "PublishOrders", new OracleParameter("@prodid", 24)); + /// + /// a valid connection string for a OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an array of SqlParamters used to execute the command + /// an int representing the number of rows affected by the command + public static int ExecuteNonQuery(string connectionString, CommandType commandType, string commandText, params OracleParameter[] commandParameters) + { + //create & open a OracleConnection, and dispose of it after we are done. + using (OracleConnection cn = new OracleConnection(connectionString)) + { + cn.Open(); + + //call the overload that takes a connection in place of the connection string + return ExecuteNonQuery(cn, commandType, commandText, commandParameters); + } + } + + /// + /// Execute a stored procedure via a SqlCommand (that returns no resultset) against the database specified in + /// the connection string using the provided parameter values. This method will query the database to discover the parameters for the + /// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. + /// + /// + /// This method provides no access to output parameters or the stored procedure's return value parameter. + /// + /// e.g.: + /// int result = ExecuteNonQuery(connString, "PublishOrders", 24, 36); + /// + /// a valid connection string for a OracleConnection + /// the name of the stored prcedure + /// an array of objects to be assigned as the input values of the stored procedure + /// an int representing the number of rows affected by the command + public static int ExecuteNonQuery(string connectionString, string spName, params object[] parameterValues) + { + //if we receive parameter values, we need to figure out where they go + if ((parameterValues != null) && (parameterValues.Length > 0)) + { + //pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache) + OracleParameter[] commandParameters = OracleHelperParameterCache.GetSpParameterSet(connectionString, spName); + + //assign the provided values to these parameters based on parameter order + AssignParameterValues(commandParameters, parameterValues); + + //call the overload that takes an array of SqlParameters + return ExecuteNonQuery(connectionString, CommandType.StoredProcedure, spName, commandParameters); + } + //otherwise we can just call the SP without params + return ExecuteNonQuery(connectionString, CommandType.StoredProcedure, spName); + } + + /// + /// Execute a SqlCommand (that returns no resultset and takes no parameters) against the provided OracleConnection. + /// + /// + /// e.g.: + /// int result = ExecuteNonQuery(conn, CommandType.StoredProcedure, "PublishOrders"); + /// + /// a valid OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an int representing the number of rows affected by the command + public static int ExecuteNonQuery(OracleConnection connection, CommandType commandType, string commandText) + { + //pass through the call providing null for the set of SqlParameters + return ExecuteNonQuery(connection, commandType, commandText, null); + } + + /// + /// Execute a SqlCommand (that returns no resultset) against the specified OracleConnection + /// using the provided parameters. + /// + /// + /// e.g.: + /// int result = ExecuteNonQuery(conn, CommandType.StoredProcedure, "PublishOrders", new OracleParameter("@prodid", 24)); + /// + /// a valid OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an array of SqlParamters used to execute the command + /// an int representing the number of rows affected by the command + public static int ExecuteNonQuery(OracleConnection connection, CommandType commandType, string commandText, params OracleParameter[] commandParameters) + { + //create a command and prepare it for execution + + OracleCommand cmd = new OracleCommand(); + PrepareCommand(cmd, connection, null, commandType, commandText, commandParameters); + + //finally, execute the command. + int retval = cmd.ExecuteNonQuery(); + + // detach the SqlParameters from the command object, so they can be used again. + cmd.Parameters.Clear(); + return retval; + } + + public static int ExecuteNonQueryWithTimeout(string connectionString, CommandType commandType, string commandText, int cmdTimeout) + { + //create a command and prepare it for execution + using (OracleConnection cn = new OracleConnection(connectionString)) + { + cn.Open(); + OracleCommand cmd = new OracleCommand(); + PrepareCommand(cmd, cn, null, commandType, commandText, null); + cmd.CommandTimeout = cmdTimeout; + //finally, execute the command. + int retval = cmd.ExecuteNonQuery(); + + // detach the SqlParameters from the command object, so they can be used again. + cmd.Parameters.Clear(); + return retval; + } + + } + /// + /// Execute a stored procedure via a SqlCommand (that returns no resultset) against the specified OracleConnection + /// using the provided parameter values. This method will query the database to discover the parameters for the + /// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. + /// + /// + /// This method provides no access to output parameters or the stored procedure's return value parameter. + /// + /// e.g.: + /// int result = ExecuteNonQuery(conn, "PublishOrders", 24, 36); + /// + /// a valid OracleConnection + /// the name of the stored procedure + /// an array of objects to be assigned as the input values of the stored procedure + /// an int representing the number of rows affected by the command + public static int ExecuteNonQuery(OracleConnection connection, string spName, params object[] parameterValues) + { + //if we receive parameter values, we need to figure out where they go + if ((parameterValues != null) && (parameterValues.Length > 0)) + { + //pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache) + OracleParameter[] commandParameters = OracleHelperParameterCache.GetSpParameterSet(connection.ConnectionString, spName); + + //assign the provided values to these parameters based on parameter order + AssignParameterValues(commandParameters, parameterValues); + + //call the overload that takes an array of SqlParameters + return ExecuteNonQuery(connection, CommandType.StoredProcedure, spName, commandParameters); + } + //otherwise we can just call the SP without params + return ExecuteNonQuery(connection, CommandType.StoredProcedure, spName); + } + + /// + /// Execute a SqlCommand (that returns no resultset and takes no parameters) against the provided OracleTransaction. + /// + /// + /// e.g.: + /// int result = ExecuteNonQuery(trans, CommandType.StoredProcedure, "PublishOrders"); + /// + /// a valid OracleTransaction + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an int representing the number of rows affected by the command + public static int ExecuteNonQuery(OracleTransaction transaction, CommandType commandType, string commandText) + { + //pass through the call providing null for the set of SqlParameters + return ExecuteNonQuery(transaction, commandType, commandText, null); + } + + /// + /// Execute a SqlCommand (that returns no resultset) against the specified OracleTransaction + /// using the provided parameters. + /// + /// + /// e.g.: + /// int result = ExecuteNonQuery(trans, CommandType.StoredProcedure, "GetOrders", new OracleParameter("@prodid", 24)); + /// + /// a valid OracleTransaction + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an array of SqlParamters used to execute the command + /// an int representing the number of rows affected by the command + public static int ExecuteNonQuery(OracleTransaction transaction, CommandType commandType, string commandText, params OracleParameter[] commandParameters) + { + //create a command and prepare it for execution + OracleCommand cmd = new OracleCommand(); + PrepareCommand(cmd, transaction.Connection, transaction, commandType, commandText, commandParameters); + + //finally, execute the command. + int retval = cmd.ExecuteNonQuery(); + + // detach the SqlParameters from the command object, so they can be used again. + cmd.Parameters.Clear(); + return retval; + } + + /// + /// Execute a stored procedure via a SqlCommand (that returns no resultset) against the specified + /// OracleTransaction using the provided parameter values. This method will query the database to discover the parameters for the + /// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. + /// + /// + /// This method provides no access to output parameters or the stored procedure's return value parameter. + /// + /// e.g.: + /// int result = ExecuteNonQuery(conn, trans, "PublishOrders", 24, 36); + /// + /// a valid OracleTransaction + /// the name of the stored procedure + /// an array of objects to be assigned as the input values of the stored procedure + /// an int representing the number of rows affected by the command + public static int ExecuteNonQuery(OracleTransaction transaction, string spName, params object[] parameterValues) + { + //if we receive parameter values, we need to figure out where they go + if ((parameterValues != null) && (parameterValues.Length > 0)) + { + //pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache) + OracleParameter[] commandParameters = OracleHelperParameterCache.GetSpParameterSet(transaction.Connection.ConnectionString, spName); + + //assign the provided values to these parameters based on parameter order + AssignParameterValues(commandParameters, parameterValues); + + //call the overload that takes an array of SqlParameters + return ExecuteNonQuery(transaction, CommandType.StoredProcedure, spName, commandParameters); + } + //otherwise we can just call the SP without params + return ExecuteNonQuery(transaction, CommandType.StoredProcedure, spName); + } + + + #endregion ExecuteNonQuery + + #region ExecuteDataSet + + /// + /// Execute a SqlCommand (that returns a resultset and takes no parameters) against the database specified in + /// the connection string. + /// + /// + /// e.g.: + /// DataSet ds = ExecuteDataset(connString, CommandType.StoredProcedure, "GetOrders"); + /// + /// a valid connection string for a OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// a dataset containing the resultset generated by the command + public static DataSet ExecuteDataset(string connectionString, CommandType commandType, string commandText) + { + //pass through the call providing null for the set of SqlParameters + return ExecuteDataset(connectionString, commandType, commandText, null); + } + + /// + /// Execute a SqlCommand (that returns a resultset) against the database specified in the connection string + /// using the provided parameters. + /// + /// + /// e.g.: + /// DataSet ds = ExecuteDataset(connString, CommandType.StoredProcedure, "GetOrders", new OracleParameter("@prodid", 24)); + /// + /// a valid connection string for a OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an array of SqlParamters used to execute the command + /// a dataset containing the resultset generated by the command + public static DataSet ExecuteDataset(string connectionString, CommandType commandType, string commandText, params OracleParameter[] commandParameters) + { + //create & open a OracleConnection, and dispose of it after we are done. + using (OracleConnection cn = new OracleConnection(connectionString)) + { + cn.Open(); + + //call the overload that takes a connection in place of the connection string + return ExecuteDataset(cn, commandType, commandText, commandParameters); + } + } + + /// + /// Execute a stored procedure via a SqlCommand (that returns a resultset) against the database specified in + /// the connection string using the provided parameter values. This method will query the database to discover the parameters for the + /// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. + /// + /// + /// This method provides no access to output parameters or the stored procedure's return value parameter. + /// + /// e.g.: + /// DataSet ds = ExecuteDataset(connString, "GetOrders", 24, 36); + /// + /// a valid connection string for a OracleConnection + /// the name of the stored procedure + /// an array of objects to be assigned as the input values of the stored procedure + /// a dataset containing the resultset generated by the command + public static DataSet ExecuteDataset(string connectionString, string spName, params object[] parameterValues) + { + //if we receive parameter values, we need to figure out where they go + if ((parameterValues != null) && (parameterValues.Length > 0)) + { + //pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache) + OracleParameter[] commandParameters = OracleHelperParameterCache.GetSpParameterSet(connectionString, spName); + + //assign the provided values to these parameters based on parameter order + AssignParameterValues(commandParameters, parameterValues); + + //call the overload that takes an array of SqlParameters + return ExecuteDataset(connectionString, CommandType.StoredProcedure, spName, commandParameters); + } + //otherwise we can just call the SP without params + return ExecuteDataset(connectionString, CommandType.StoredProcedure, spName); + } + + /// + /// Execute a SqlCommand (that returns a resultset and takes no parameters) against the provided OracleConnection. + /// + /// + /// e.g.: + /// DataSet ds = ExecuteDataset(conn, CommandType.StoredProcedure, "GetOrders"); + /// + /// a valid OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// a dataset containing the resultset generated by the command + public static DataSet ExecuteDataset(OracleConnection connection, CommandType commandType, string commandText) + { + //pass through the call providing null for the set of SqlParameters + return ExecuteDataset(connection, commandType, commandText, null); + } + + /// + /// Execute a SqlCommand (that returns a resultset) against the specified OracleConnection + /// using the provided parameters. + /// + /// + /// e.g.: + /// DataSet ds = ExecuteDataset(conn, CommandType.StoredProcedure, "GetOrders", new OracleParameter("@prodid", 24)); + /// + /// a valid OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an array of SqlParamters used to execute the command + /// a dataset containing the resultset generated by the command + public static DataSet ExecuteDataset(OracleConnection connection, CommandType commandType, string commandText, params OracleParameter[] commandParameters) + { + //create a command and prepare it for execution + OracleCommand cmd = new OracleCommand(); + PrepareCommand(cmd, connection, null, commandType, commandText, commandParameters); + + //create the DataAdapter & DataSet + OracleDataAdapter da = new OracleDataAdapter(cmd); + DataSet ds = new DataSet(); + + //fill the DataSet using default values for DataTable names, etc. + da.Fill(ds); + + // detach the SqlParameters from the command object, so they can be used again. + cmd.Parameters.Clear(); + + //return the dataset + return ds; + } + + /// + /// Execute a stored procedure via a SqlCommand (that returns a resultset) against the specified OracleConnection + /// using the provided parameter values. This method will query the database to discover the parameters for the + /// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. + /// + /// + /// This method provides no access to output parameters or the stored procedure's return value parameter. + /// + /// e.g.: + /// DataSet ds = ExecuteDataset(conn, "GetOrders", 24, 36); + /// + /// a valid OracleConnection + /// the name of the stored procedure + /// an array of objects to be assigned as the input values of the stored procedure + /// a dataset containing the resultset generated by the command + public static DataSet ExecuteDataset(OracleConnection connection, string spName, params object[] parameterValues) + { + //if we receive parameter values, we need to figure out where they go + if ((parameterValues != null) && (parameterValues.Length > 0)) + { + //pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache) + OracleParameter[] commandParameters = OracleHelperParameterCache.GetSpParameterSet(connection.ConnectionString, spName); + + //assign the provided values to these parameters based on parameter order + AssignParameterValues(commandParameters, parameterValues); + + //call the overload that takes an array of SqlParameters + return ExecuteDataset(connection, CommandType.StoredProcedure, spName, commandParameters); + } + //otherwise we can just call the SP without params + return ExecuteDataset(connection, CommandType.StoredProcedure, spName); + } + + /// + /// Execute a SqlCommand (that returns a resultset and takes no parameters) against the provided OracleTransaction. + /// + /// + /// e.g.: + /// DataSet ds = ExecuteDataset(trans, CommandType.StoredProcedure, "GetOrders"); + /// + /// a valid OracleTransaction + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// a dataset containing the resultset generated by the command + public static DataSet ExecuteDataset(OracleTransaction transaction, CommandType commandType, string commandText) + { + //pass through the call providing null for the set of SqlParameters + return ExecuteDataset(transaction, commandType, commandText, null); + } + + /// + /// Execute a SqlCommand (that returns a resultset) against the specified OracleTransaction + /// using the provided parameters. + /// + /// + /// e.g.: + /// DataSet ds = ExecuteDataset(trans, CommandType.StoredProcedure, "GetOrders", new OracleParameter("@prodid", 24)); + /// + /// a valid OracleTransaction + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an array of SqlParamters used to execute the command + /// a dataset containing the resultset generated by the command + public static DataSet ExecuteDataset(OracleTransaction transaction, CommandType commandType, string commandText, params OracleParameter[] commandParameters) + { + //create a command and prepare it for execution + OracleCommand cmd = new OracleCommand(); + PrepareCommand(cmd, transaction.Connection, transaction, commandType, commandText, commandParameters); + + //create the DataAdapter & DataSet + OracleDataAdapter da = new OracleDataAdapter(cmd); + DataSet ds = new DataSet(); + + //fill the DataSet using default values for DataTable names, etc. + da.Fill(ds); + + // detach the SqlParameters from the command object, so they can be used again. + cmd.Parameters.Clear(); + + //return the dataset + return ds; + } + + /// + /// Execute a stored procedure via a SqlCommand (that returns a resultset) against the specified + /// OracleTransaction using the provided parameter values. This method will query the database to discover the parameters for the + /// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. + /// + /// + /// This method provides no access to output parameters or the stored procedure's return value parameter. + /// + /// e.g.: + /// DataSet ds = ExecuteDataset(trans, "GetOrders", 24, 36); + /// + /// a valid OracleTransaction + /// the name of the stored procedure + /// an array of objects to be assigned as the input values of the stored procedure + /// a dataset containing the resultset generated by the command + public static DataSet ExecuteDataset(OracleTransaction transaction, string spName, params object[] parameterValues) + { + //if we receive parameter values, we need to figure out where they go + if ((parameterValues != null) && (parameterValues.Length > 0)) + { + //pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache) + OracleParameter[] commandParameters = OracleHelperParameterCache.GetSpParameterSet(transaction.Connection.ConnectionString, spName); + + //assign the provided values to these parameters based on parameter order + AssignParameterValues(commandParameters, parameterValues); + + //call the overload that takes an array of SqlParameters + return ExecuteDataset(transaction, CommandType.StoredProcedure, spName, commandParameters); + } + //otherwise we can just call the SP without params + return ExecuteDataset(transaction, CommandType.StoredProcedure, spName); + } + + #endregion ExecuteDataSet + + #region ExecuteReader + + /// + /// this enum is used to indicate whether the connection was provided by the caller, or created by SqlHelper, so that + /// we can set the appropriate CommandBehavior when calling ExecuteReader() + /// + private enum OracleConnectionOwnership + { + /// Connection is owned and managed by SqlHelper + Internal, + /// Connection is owned and managed by the caller + External + } + + /// + /// Create and prepare a SqlCommand, and call ExecuteReader with the appropriate CommandBehavior. + /// + /// + /// If we created and opened the connection, we want the connection to be closed when the DataReader is closed. + /// + /// If the caller provided the connection, we want to leave it to them to manage. + /// + /// a valid OracleConnection, on which to execute this command + /// a valid OracleTransaction, or 'null' + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an array of SqlParameters to be associated with the command or 'null' if no parameters are required + /// indicates whether the connection parameter was provided by the caller, or created by SqlHelper + /// SqlDataReader containing the results of the command + private static OracleDataReader ExecuteReader(OracleConnection connection, OracleTransaction transaction, CommandType commandType, string commandText, OracleParameter[] commandParameters, OracleConnectionOwnership connectionOwnership) + { + //create a command and prepare it for execution + OracleCommand cmd = new OracleCommand(); + PrepareCommand(cmd, connection, transaction, commandType, commandText, commandParameters); + + //create a reader + OracleDataReader dr; + + // call ExecuteReader with the appropriate CommandBehavior + if (connectionOwnership == OracleConnectionOwnership.External) + { + dr = cmd.ExecuteReader(); + } + else + { + dr = cmd.ExecuteReader(CommandBehavior.CloseConnection); + + } + + // detach the SqlParameters from the command object, so they can be used again. + cmd.Parameters.Clear(); + + return dr; + } + + /// + /// Execute a SqlCommand (that returns a resultset and takes no parameters) against the database specified in + /// the connection string. + /// + /// + /// e.g.: + /// SqlDataReader dr = ExecuteReader(connString, CommandType.StoredProcedure, "GetOrders"); + /// + /// a valid connection string for a OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// a SqlDataReader containing the resultset generated by the command + public static OracleDataReader ExecuteReader(string connectionString, CommandType commandType, string commandText) + { + //pass through the call providing null for the set of SqlParameters + return ExecuteReader(connectionString, commandType, commandText, null); + } + + /// + /// Execute a SqlCommand (that returns a resultset) against the database specified in the connection string + /// using the provided parameters. + /// + /// + /// e.g.: + /// SqlDataReader dr = ExecuteReader(connString, CommandType.StoredProcedure, "GetOrders", new OracleParameter("@prodid", 24)); + /// + /// a valid connection string for a OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an array of SqlParamters used to execute the command + /// a SqlDataReader containing the resultset generated by the command + public static OracleDataReader ExecuteReader(string connectionString, CommandType commandType, string commandText, params OracleParameter[] commandParameters) + { + //create & open a OracleConnection + OracleConnection cn = new OracleConnection(connectionString); + cn.Open(); + + try + { + //call the private overload that takes an internally owned connection in place of the connection string + return ExecuteReader(cn, null, commandType, commandText, commandParameters, OracleConnectionOwnership.Internal); + } + catch + { + //if we fail to return the SqlDatReader, we need to close the connection ourselves + cn.Close(); + throw; + } + } + + /// + /// Execute a stored procedure via a SqlCommand (that returns a resultset) against the database specified in + /// the connection string using the provided parameter values. This method will query the database to discover the parameters for the + /// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. + /// + /// + /// This method provides no access to output parameters or the stored procedure's return value parameter. + /// + /// e.g.: + /// SqlDataReader dr = ExecuteReader(connString, "GetOrders", 24, 36); + /// + /// a valid connection string for a OracleConnection + /// the name of the stored procedure + /// an array of objects to be assigned as the input values of the stored procedure + /// a SqlDataReader containing the resultset generated by the command + public static OracleDataReader ExecuteReader(string connectionString, string spName, params object[] parameterValues) + { + //if we receive parameter values, we need to figure out where they go + if ((parameterValues != null) && (parameterValues.Length > 0)) + { + //pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache) + OracleParameter[] commandParameters = OracleHelperParameterCache.GetSpParameterSet(connectionString, spName); + + //assign the provided values to these parameters based on parameter order + AssignParameterValues(commandParameters, parameterValues); + + //call the overload that takes an array of SqlParameters + return ExecuteReader(connectionString, CommandType.StoredProcedure, spName, commandParameters); + } + //otherwise we can just call the SP without params + return ExecuteReader(connectionString, CommandType.StoredProcedure, spName); + } + + /// + /// Execute a SqlCommand (that returns a resultset and takes no parameters) against the provided OracleConnection. + /// + /// + /// e.g.: + /// SqlDataReader dr = ExecuteReader(conn, CommandType.StoredProcedure, "GetOrders"); + /// + /// a valid OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// a SqlDataReader containing the resultset generated by the command + public static OracleDataReader ExecuteReader(OracleConnection connection, CommandType commandType, string commandText) + { + //pass through the call providing null for the set of SqlParameters + return ExecuteReader(connection, commandType, commandText, null); + } + + /// + /// Execute a SqlCommand (that returns a resultset) against the specified OracleConnection + /// using the provided parameters. + /// + /// + /// e.g.: + /// SqlDataReader dr = ExecuteReader(conn, CommandType.StoredProcedure, "GetOrders", new OracleParameter("@prodid", 24)); + /// + /// a valid OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an array of SqlParamters used to execute the command + /// a SqlDataReader containing the resultset generated by the command + public static OracleDataReader ExecuteReader(OracleConnection connection, CommandType commandType, string commandText, params OracleParameter[] commandParameters) + { + //pass through the call to the private overload using a null transaction value and an externally owned connection + return ExecuteReader(connection, null, commandType, commandText, commandParameters, OracleConnectionOwnership.External); + } + + /// + /// Execute a stored procedure via a SqlCommand (that returns a resultset) against the specified OracleConnection + /// using the provided parameter values. This method will query the database to discover the parameters for the + /// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. + /// + /// + /// This method provides no access to output parameters or the stored procedure's return value parameter. + /// + /// e.g.: + /// SqlDataReader dr = ExecuteReader(conn, "GetOrders", 24, 36); + /// + /// a valid OracleConnection + /// the name of the stored procedure + /// an array of objects to be assigned as the input values of the stored procedure + /// a SqlDataReader containing the resultset generated by the command + public static OracleDataReader ExecuteReader(OracleConnection connection, string spName, params object[] parameterValues) + { + //if we receive parameter values, we need to figure out where they go + if ((parameterValues != null) && (parameterValues.Length > 0)) + { + OracleParameter[] commandParameters = OracleHelperParameterCache.GetSpParameterSet(connection.ConnectionString, spName); + + AssignParameterValues(commandParameters, parameterValues); + + return ExecuteReader(connection, CommandType.StoredProcedure, spName, commandParameters); + } + //otherwise we can just call the SP without params + return ExecuteReader(connection, CommandType.StoredProcedure, spName); + } + + /// + /// Execute a SqlCommand (that returns a resultset and takes no parameters) against the provided OracleTransaction. + /// + /// + /// e.g.: + /// SqlDataReader dr = ExecuteReader(trans, CommandType.StoredProcedure, "GetOrders"); + /// + /// a valid OracleTransaction + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// a SqlDataReader containing the resultset generated by the command + public static OracleDataReader ExecuteReader(OracleTransaction transaction, CommandType commandType, string commandText) + { + //pass through the call providing null for the set of SqlParameters + return ExecuteReader(transaction, commandType, commandText, null); + } + + /// + /// Execute a SqlCommand (that returns a resultset) against the specified OracleTransaction + /// using the provided parameters. + /// + /// + /// e.g.: + /// SqlDataReader dr = ExecuteReader(trans, CommandType.StoredProcedure, "GetOrders", new OracleParameter("@prodid", 24)); + /// + /// a valid OracleTransaction + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an array of SqlParamters used to execute the command + /// a SqlDataReader containing the resultset generated by the command + public static OracleDataReader ExecuteReader(OracleTransaction transaction, CommandType commandType, string commandText, params OracleParameter[] commandParameters) + { + //pass through to private overload, indicating that the connection is owned by the caller + return ExecuteReader(transaction.Connection, transaction, commandType, commandText, commandParameters, OracleConnectionOwnership.External); + } + + /// + /// Execute a stored procedure via a SqlCommand (that returns a resultset) against the specified + /// OracleTransaction using the provided parameter values. This method will query the database to discover the parameters for the + /// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. + /// + /// + /// This method provides no access to output parameters or the stored procedure's return value parameter. + /// + /// e.g.: + /// SqlDataReader dr = ExecuteReader(trans, "GetOrders", 24, 36); + /// + /// a valid OracleTransaction + /// the name of the stored procedure + /// an array of objects to be assigned as the input values of the stored procedure + /// a SqlDataReader containing the resultset generated by the command + public static OracleDataReader ExecuteReader(OracleTransaction transaction, string spName, params object[] parameterValues) + { + //if we receive parameter values, we need to figure out where they go + if ((parameterValues != null) && (parameterValues.Length > 0)) + { + OracleParameter[] commandParameters = OracleHelperParameterCache.GetSpParameterSet(transaction.Connection.ConnectionString, spName); + + AssignParameterValues(commandParameters, parameterValues); + + return ExecuteReader(transaction, CommandType.StoredProcedure, spName, commandParameters); + } + //otherwise we can just call the SP without params + return ExecuteReader(transaction, CommandType.StoredProcedure, spName); + } + + #endregion ExecuteReader + + #region ExecuteScalar + + /// + /// Execute a OracleCommand (that returns a 1x1 resultset and takes no parameters) against the database specified in + /// the connection string. + /// + /// + /// e.g.: + /// int orderCount = (int)ExecuteScalar(connString, CommandType.StoredProcedure, "GetOrderCount"); + /// + /// a valid connection string for a OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an object containing the value in the 1x1 resultset generated by the command + public static object ExecuteScalar(string connectionString, CommandType commandType, string commandText) + { + //pass through the call providing null for the set of SqlParameters + return ExecuteScalar(connectionString, commandType, commandText, null); + } + + /// + /// Execute a OracleCommand (that returns a 1x1 resultset) against the database specified in the connection string + /// using the provided parameters. + /// + /// + /// e.g.: + /// int orderCount = (int)ExecuteScalar(connString, CommandType.StoredProcedure, "GetOrderCount", new OracleParameter("@prodid", 24)); + /// + /// a valid connection string for a OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an array of SqlParamters used to execute the command + /// an object containing the value in the 1x1 resultset generated by the command + public static object ExecuteScalar(string connectionString, CommandType commandType, string commandText, params OracleParameter[] commandParameters) + { + //create & open a OracleConnection, and dispose of it after we are done. + using (OracleConnection cn = new OracleConnection(connectionString)) + { + cn.Open(); + + //call the overload that takes a connection in place of the connection string + return ExecuteScalar(cn, commandType, commandText, commandParameters); + } + } + + /// + /// Execute a stored procedure via a OracleCommand (that returns a 1x1 resultset) against the database specified in + /// the connection string using the provided parameter values. This method will query the database to discover the parameters for the + /// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. + /// + /// + /// This method provides no access to output parameters or the stored procedure's return value parameter. + /// + /// e.g.: + /// int orderCount = (int)ExecuteScalar(connString, "GetOrderCount", 24, 36); + /// + /// a valid connection string for a OracleConnection + /// the name of the stored procedure + /// an array of objects to be assigned as the input values of the stored procedure + /// an object containing the value in the 1x1 resultset generated by the command + public static object ExecuteScalar(string connectionString, string spName, params object[] parameterValues) + { + //if we receive parameter values, we need to figure out where they go + if ((parameterValues != null) && (parameterValues.Length > 0)) + { + //pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache) + OracleParameter[] commandParameters = OracleHelperParameterCache.GetSpParameterSet(connectionString, spName); + + //assign the provided values to these parameters based on parameter order + AssignParameterValues(commandParameters, parameterValues); + + //call the overload that takes an array of SqlParameters + return ExecuteScalar(connectionString, CommandType.StoredProcedure, spName, commandParameters); + } + //otherwise we can just call the SP without params + return ExecuteScalar(connectionString, CommandType.StoredProcedure, spName); + } + + /// + /// Execute a OracleCommand (that returns a 1x1 resultset and takes no parameters) against the provided OracleConnection. + /// + /// + /// e.g.: + /// int orderCount = (int)ExecuteScalar(conn, CommandType.StoredProcedure, "GetOrderCount"); + /// + /// a valid OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an object containing the value in the 1x1 resultset generated by the command + public static object ExecuteScalar(OracleConnection connection, CommandType commandType, string commandText) + { + //pass through the call providing null for the set of SqlParameters + return ExecuteScalar(connection, commandType, commandText, null); + } + + /// + /// Execute a OracleCommand (that returns a 1x1 resultset) against the specified OracleConnection + /// using the provided parameters. + /// + /// + /// e.g.: + /// int orderCount = (int)ExecuteScalar(conn, CommandType.StoredProcedure, "GetOrderCount", new OracleParameter("@prodid", 24)); + /// + /// a valid OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an array of SqlParamters used to execute the command + /// an object containing the value in the 1x1 resultset generated by the command + public static object ExecuteScalar(OracleConnection connection, CommandType commandType, string commandText, params OracleParameter[] commandParameters) + { + //create a command and prepare it for execution + OracleCommand cmd = new OracleCommand(); + PrepareCommand(cmd, connection, null, commandType, commandText, commandParameters); + + //execute the command & return the results + object retval = cmd.ExecuteScalar(); + + // detach the SqlParameters from the command object, so they can be used again. + cmd.Parameters.Clear(); + return retval; + + } + + /// + /// Execute a stored procedure via a OracleCommand (that returns a 1x1 resultset) against the specified OracleConnection + /// using the provided parameter values. This method will query the database to discover the parameters for the + /// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. + /// + /// + /// This method provides no access to output parameters or the stored procedure's return value parameter. + /// + /// e.g.: + /// int orderCount = (int)ExecuteScalar(conn, "GetOrderCount", 24, 36); + /// + /// a valid OracleConnection + /// the name of the stored procedure + /// an array of objects to be assigned as the input values of the stored procedure + /// an object containing the value in the 1x1 resultset generated by the command + public static object ExecuteScalar(OracleConnection connection, string spName, params object[] parameterValues) + { + //if we receive parameter values, we need to figure out where they go + if ((parameterValues != null) && (parameterValues.Length > 0)) + { + //pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache) + OracleParameter[] commandParameters = OracleHelperParameterCache.GetSpParameterSet(connection.ConnectionString, spName); + + //assign the provided values to these parameters based on parameter order + AssignParameterValues(commandParameters, parameterValues); + + //call the overload that takes an array of SqlParameters + return ExecuteScalar(connection, CommandType.StoredProcedure, spName, commandParameters); + } + //otherwise we can just call the SP without params + return ExecuteScalar(connection, CommandType.StoredProcedure, spName); + } + + /// + /// Execute a OracleCommand (that returns a 1x1 resultset and takes no parameters) against the provided OracleTransaction. + /// + /// + /// e.g.: + /// int orderCount = (int)ExecuteScalar(trans, CommandType.StoredProcedure, "GetOrderCount"); + /// + /// a valid OracleTransaction + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an object containing the value in the 1x1 resultset generated by the command + public static object ExecuteScalar(OracleTransaction transaction, CommandType commandType, string commandText) + { + //pass through the call providing null for the set of SqlParameters + return ExecuteScalar(transaction, commandType, commandText, null); + } + + /// + /// Execute a OracleCommand (that returns a 1x1 resultset) against the specified OracleTransaction + /// using the provided parameters. + /// + /// + /// e.g.: + /// int orderCount = (int)ExecuteScalar(trans, CommandType.StoredProcedure, "GetOrderCount", new OracleParameter("@prodid", 24)); + /// + /// a valid OracleTransaction + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an array of SqlParamters used to execute the command + /// an object containing the value in the 1x1 resultset generated by the command + public static object ExecuteScalar(OracleTransaction transaction, CommandType commandType, string commandText, params OracleParameter[] commandParameters) + { + //create a command and prepare it for execution + OracleCommand cmd = new OracleCommand(); + PrepareCommand(cmd, transaction.Connection, transaction, commandType, commandText, commandParameters); + + //execute the command & return the results + object retval = cmd.ExecuteScalar(); + + // detach the SqlParameters from the command object, so they can be used again. + cmd.Parameters.Clear(); + return retval; + } + + /// + /// Execute a stored procedure via a OracleCommand (that returns a 1x1 resultset) against the specified + /// OracleTransaction using the provided parameter values. This method will query the database to discover the parameters for the + /// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. + /// + /// + /// This method provides no access to output parameters or the stored procedure's return value parameter. + /// + /// e.g.: + /// int orderCount = (int)ExecuteScalar(trans, "GetOrderCount", 24, 36); + /// + /// a valid OracleTransaction + /// the name of the stored procedure + /// an array of objects to be assigned as the input values of the stored procedure + /// an object containing the value in the 1x1 resultset generated by the command + public static object ExecuteScalar(OracleTransaction transaction, string spName, params object[] parameterValues) + { + //if we receive parameter values, we need to figure out where they go + if ((parameterValues != null) && (parameterValues.Length > 0)) + { + //pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache) + OracleParameter[] commandParameters = OracleHelperParameterCache.GetSpParameterSet(transaction.Connection.ConnectionString, spName); + + //assign the provided values to these parameters based on parameter order + AssignParameterValues(commandParameters, parameterValues); + + //call the overload that takes an array of SqlParameters + return ExecuteScalar(transaction, CommandType.StoredProcedure, spName, commandParameters); + } + //otherwise we can just call the SP without params + return ExecuteScalar(transaction, CommandType.StoredProcedure, spName); + } + + #endregion ExecuteScalar + + + } + /// + /// OracleHelperParameterCache provides functions to leverage a static cache of procedure parameters, and the + /// ability to discover parameters for stored procedures at run-time. + /// + /// + + public sealed class OracleHelperParameterCache + { + #region private methods, variables, and constructors + + //Since this class provides only static methods, make the default constructor private to prevent + //instances from being created with "new SqlHelperParameterCache()". + private OracleHelperParameterCache() { } + + private static Hashtable paramCache = Hashtable.Synchronized(new Hashtable()); + + /// + /// resolve at run time the appropriate set of SqlParameters for a stored procedure + /// + /// a valid connection string for a OracleConnection + /// the name of the stored procedure + /// whether or not to include their return value parameter + /// + private static OracleParameter[] DiscoverSpParameterSet(string connectionString, string spName, bool includeReturnValueParameter) + { + using (OracleConnection cn = new OracleConnection(connectionString)) + using (OracleCommand cmd = new OracleCommand(spName, cn)) + { + cn.Open(); + cmd.CommandType = CommandType.StoredProcedure; + OracleCommandBuilder.DeriveParameters(cmd); + + if (!includeReturnValueParameter) + { + cmd.Parameters.RemoveAt(0); + } + + OracleParameter[] discoveredParameters = new OracleParameter[cmd.Parameters.Count]; ; + + cmd.Parameters.CopyTo(discoveredParameters, 0); + + return discoveredParameters; + } + } + + //deep copy of cached OracleParameter array + private static OracleParameter[] CloneParameters(OracleParameter[] originalParameters) + { + OracleParameter[] clonedParameters = new OracleParameter[originalParameters.Length]; + + for (int i = 0, j = originalParameters.Length; i < j; i++) + { + clonedParameters[i] = (OracleParameter)((ICloneable)originalParameters[i]).Clone(); + } + + return clonedParameters; + } + + #endregion private methods, variables, and constructors + + #region caching functions + + /// + /// add parameter array to the cache + /// + /// a valid connection string for a OracleConnection + /// the stored procedure name or T-SQL command + /// an array of SqlParamters to be cached + public static void CacheParameterSet(string connectionString, string commandText, params OracleParameter[] commandParameters) + { + string hashKey = connectionString + ":" + commandText; + + paramCache[hashKey] = commandParameters; + } + + /// + /// retrieve a parameter array from the cache + /// + /// a valid connection string for a OracleConnection + /// the stored procedure name or T-SQL command + /// an array of SqlParamters + public static OracleParameter[] GetCachedParameterSet(string connectionString, string commandText) + { + string hashKey = connectionString + ":" + commandText; + + OracleParameter[] cachedParameters = (OracleParameter[])paramCache[hashKey]; + + if (cachedParameters == null) + { + return null; + } + return CloneParameters(cachedParameters); + } + + #endregion caching functions + + #region Parameter Discovery Functions + + /// + /// Retrieves the set of SqlParameters appropriate for the stored procedure + /// + /// + /// This method will query the database for this information, and then store it in a cache for future requests. + /// + /// a valid connection string for a OracleConnection + /// the name of the stored procedure + /// an array of SqlParameters + public static OracleParameter[] GetSpParameterSet(string connectionString, string spName) + { + return GetSpParameterSet(connectionString, spName, false); + } + + /// + /// Retrieves the set of SqlParameters appropriate for the stored procedure + /// + /// + /// This method will query the database for this information, and then store it in a cache for future requests. + /// + /// a valid connection string for a OracleConnection + /// the name of the stored procedure + /// a bool value indicating whether the return value parameter should be included in the results + /// an array of SqlParameters + public static OracleParameter[] GetSpParameterSet(string connectionString, string spName, bool includeReturnValueParameter) + { + string hashKey = connectionString + ":" + spName + (includeReturnValueParameter ? ":include ReturnValue Parameter" : ""); + + OracleParameter[] cachedParameters; + + cachedParameters = (OracleParameter[])paramCache[hashKey]; + + if (cachedParameters == null) + { + cachedParameters = (OracleParameter[])(paramCache[hashKey] = DiscoverSpParameterSet(connectionString, spName, includeReturnValueParameter)); + } + + return CloneParameters(cachedParameters); + } + + #endregion Parameter Discovery Functions + } +} diff --git a/Utility.cs b/Utility.cs index 1429fd9..4e64d66 100644 --- a/Utility.cs +++ b/Utility.cs @@ -17,6 +17,11 @@ { public class Utility { + public static string DBServer; + public static string Database; + public static string UserID; + public static string DBPassword; + public static void SetBallons(GSOBalloon featureTooltip,GSOBalloonEx balloonEx) { featureTooltip.CacheFilePath = Path.GetDirectoryName(Application.ExecutablePath) + "/GeoScene/Globe/Temp"; diff --git a/bin/x64/Debug/LSPipeline.exe b/bin/x64/Debug/LSPipeline.exe index 833a5e5..76f838b 100644 --- a/bin/x64/Debug/LSPipeline.exe +++ b/bin/x64/Debug/LSPipeline.exe Binary files differ diff --git a/bin/x64/Debug/LSPipeline.pdb b/bin/x64/Debug/LSPipeline.pdb index 245e727..28c81dc 100644 --- a/bin/x64/Debug/LSPipeline.pdb +++ b/bin/x64/Debug/LSPipeline.pdb Binary files differ diff --git a/FrmDatabaseParaSettingOracle.cs b/FrmDatabaseParaSettingOracle.cs index 18c5e99..6e97dfb 100644 --- a/FrmDatabaseParaSettingOracle.cs +++ b/FrmDatabaseParaSettingOracle.cs @@ -47,12 +47,15 @@ } string serverIp = textBoxIP.Text.Trim(); + /* string hostName = System.Net.Dns.GetHostName(); if (serverIp == hostName || serverIp == "localhost" || serverIp == System.Net.Dns.GetHostAddresses(hostName).GetValue(2).ToString()) { serverIp = "127.0.0.1"; } + * */ + DateTime timeStart = DateTime.Now; GSODataSource ds = globeControl1.Globe.DataManager.GetDataSourceByName(serverIp + "/" + textBoxDatabase.Text.Trim() + "_" + textBoxUser.Text.Trim()); if (ds == null) @@ -83,7 +86,7 @@ connectParams.dataSourceName = ds.Name; connectParams.databaseType = EnumDataSourceType.Oracle; Utility.connectParamsOfDatabase.Add(connectParams); - + setUtilityValue(connectParams); WriteXML(); MessageBox.Show("连接Oracle数据库成功,用时:" + secondsConnectOracle.ToString() + "秒", "提示"); } @@ -92,6 +95,14 @@ this.Close(); } + private void setUtilityValue(DatabaseConnectParams connectParams) + { + Utility.DBServer = connectParams.ip; + Utility.Database = connectParams.databaseName; + Utility.UserID = connectParams.userName; + Utility.DBPassword = connectParams.password; + } + private void ReadXML() { string strFileName = Path.GetDirectoryName(Application.ExecutablePath) + "/databaseConfigOracle.xml"; diff --git a/GXBuilder.cs b/GXBuilder.cs new file mode 100644 index 0000000..b2ec9b2 --- /dev/null +++ b/GXBuilder.cs @@ -0,0 +1,187 @@ +using System; +using System.Data; +using System.Drawing; +using System.Runtime.InteropServices; +using GeoScene.Data; +using GeoScene.Engine; +using GeoScene.Globe; + +namespace WorldGIS +{ + public class GXBuilder : ModelBuilder + { + private static double diameter = 0.1; + + public GXBuilder(GSODataSource ds) + : base(ds) + { + + } + + public override bool validate(GSOLayer layer) + { + return true; + } + + /// + /// + /// + /// 追加或修改 + /// 高程入库或埋深入库 + /// + public override bool doBuild(EnumUpdateMode updateMode, + EnumBuildMode buildMode, + BaseParam param) + { + LineParam lineParam = param as LineParam; + GSOFeatureDataset newFeatureSet = ds.GetDatasetByName(lineParam.layerName) as GSOFeatureDataset; + if (newFeatureSet == null) + { + newFeatureSet = CreateDBFeatureDataset(layer, lineParam.layerName); + } + newFeatureSet.Open(); + GSOFeatures features = layer.GetAllFeatures(true); + for (int i = 0; i < features.Length; i++) + { + GSOFeature f = features[i]; + GSOGeoPolyline3D lineeee = f.Geometry as GSOGeoPolyline3D; + if (lineeee == null || lineeee.GetSpaceLength(true, 6378137) == 0) + { + LogHelper.Error("出现数据无法入库:" + f.ID); + continue; + } + + GSOFeature newFeature = newFeatureSet.CreateFeature(); + + double radius = diameter; //创建光纤的半径 + newFeature.Geometry = updateGemotry(f, lineParam, radius, buildMode); + newFeature.Geometry.Style = getPipeLineStyle(lineParam, f, radius); + newFeature.Name = f.GetFieldAsString(lineParam.uniqueIdFieldName); + setFeatureValueByShapeFeature(f, newFeature); + // newFeatureSet + if (newFeatureSet.GetFeatureByName(newFeature.Name, true).Length > 0) + { + if (!this.UpdateGXDevice(newFeatureSet.GetFeatureByName(newFeature.Name, true)[0], + newFeature)) + { + LogHelper.Error("光纤设备更新失败:" + newFeature.Name+"\r\n"); + } + continue; + } + newFeatureSet.AddFeature(newFeature); + if (!AddGXDevice(newFeature)) + { + LogHelper.Error("光纤数据保存Alarm_Device失败:" + newFeature.Name+"\r\n"); + } + } + newFeatureSet.Save(); + newFeatureSet.Close(); + return true; + } + + private bool AddGXDevice(GSOFeature feature) + { + //保存数据到设备表 + try + { + String deviceType = feature.GetValue("DEVICETYPE") == null + ? "" : feature.GetValue("DEVICETYPE").ToString(); + String devCode = feature.GetValue("DEVICEID") == null + ? "" : feature.GetValue("DEVICEID").ToString(); + String road = feature.GetValue("ROAD") == null + ? "" : feature.GetValue("ROAD").ToString(); + + //TODO LIST: + string sqlCount = "select dbid from alarm_device_type where" + + " typename = '" + deviceType + "'"; + object dbid = OracleUtils.ExecuteScalar(OracleUtils.ConnectionString, + CommandType.Text, sqlCount); + if (dbid == null) + { + return false; + } + int deviceTypeId = int.Parse(dbid.ToString()); + string sql = "Insert into alarm_device (DBID,ACTIVE,DEVCODE,DEVNAME,FACTORY," + + "INSTALLDATE,GAOCHENG,HEIGHT,LATITUDE,LONGTITUDE,DEVICETYPE_ID) " + + "values (SEQ_DEVICE_ID.NEXTVAL, 1, '" + devCode + "', '" + deviceType + devCode + + "', " + "'航天二院', " + "to_date('" + DateTime.Now.ToString() + "','yyyy/MM/dd hh24:mi::ss'), " + + "0, 0, 0, 0, " + deviceTypeId + ")"; + OracleUtils.ExecuteNonQuery(OracleUtils.ConnectionString, CommandType.Text, sql); + + } + catch (Exception e) + { + throw; + } + return true; + } + + private bool UpdateGXDevice(GSOFeature feature, GSOFeature newFeature) + { + String deviceType = newFeature.GetValue("DEVICETYPE") == null + ? "" : newFeature.GetValue("DEVICETYPE").ToString(); + String devCode = newFeature.GetValue("DEVICEID") == null + ? "" : newFeature.GetValue("DEVICEID").ToString(); + String road = newFeature.GetValue("ROAD") == null + ? "" : newFeature.GetValue("ROAD").ToString(); + + feature.Geometry = newFeature.Geometry.Clone(); + this.setFeatureValueByShapeFeature(newFeature,feature); + // feature.Dataset.Save(); + + string sqlCount = "select dbid from alarm_device_type where" + + " typename = '" + deviceType + "'"; + object dbid = OracleUtils.ExecuteScalar(OracleUtils.ConnectionString, + CommandType.Text, sqlCount); + if (dbid == null) + { + return false; + } + int deviceTypeId = int.Parse(dbid.ToString()); + + string sql = "update alarm_device set FACTORY='" + road + + "', DEVICETYPE_ID='" + deviceTypeId + + "', DEVNAME='"+deviceType+devCode+"' "+ + "where devcode='" + devCode + "'"; + OracleUtils.ExecuteNonQuery(OracleUtils.ConnectionString, CommandType.Text, sql); + return true; + } + + private GSOLineStyle3D getPipeLineStyle(LineParam lineParam, GSOFeature f, double radius) + { + GSOPipeLineStyle3D style0 = new GSOPipeLineStyle3D(); + style0.LineColor = Color.FromArgb(lineParam.transparency, lineParam.lineColor); + style0.Slice = lineParam.sliceNum; + style0.CornerSliceAngle = lineParam.cornerSliceAngle; + style0.Radius = radius; + return style0; + } + + private GSOGeometry updateGemotry(GSOFeature f, LineParam lineParam, double radius, EnumBuildMode buildMode) + { + + f.Geometry.AltitudeMode = (buildMode.Equals(EnumBuildMode.Alititude)) ? EnumAltitudeMode.RelativeToGround : EnumAltitudeMode.Absolute; + + GSOGeoPolyline3D line = f.Geometry as GSOGeoPolyline3D; + if (line == null) + { + return null; //log4net 记录错误处理 + } + + double deep1 = 0; + double deep2 = 0; + + GSOPoint3ds pt3ds = new GSOPoint3ds(); + for (int n = 0; n < line[0].Count; n++) + { + GSOPoint3d pt3d = line[0][n]; + pt3d.Z = 0; + + pt3ds.Add(pt3d); + } + line[0] = pt3ds; + return line; + } + + } +} diff --git a/HTForms/FrmPipelineModelDataBase.cs b/HTForms/FrmPipelineModelDataBase.cs index 84a2d7b..3076bdd 100644 --- a/HTForms/FrmPipelineModelDataBase.cs +++ b/HTForms/FrmPipelineModelDataBase.cs @@ -91,6 +91,7 @@ } else datasource = ds; + if (comboBoxExLayer.Text.Trim() == "") { MessageBox.Show("请选择一个图层文件!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning); @@ -126,20 +127,12 @@ comboBoxExLayer.Text)); if (layer == null) return; - FieldValidate fieldValidate = FieldValidateFactory.Create(ValidateConfig.LoadConfig(), - getEnumValidateType()); - - if (!fieldValidate.Validate(layer)) + if (txtModelLayer.Text != "传感设备图层") { - DateTime dt=DateTime.Now; - string logFilePath = Application.StartupPath + "\\log\\" + dt.Year + "\\" + dt.Year + dt.Month + "\\" + dt.Year + - dt.Month + dt.Day + ".txt"; - MessageBox.Show("选择的数据不符合数据规范,详情见日志" + logFilePath, "提示"); - return; + if (!getValidateResult(layer)) + return; } - ModelBuilder lineBuilder = new LineBuilder(datasource); - LineParam lineParam = new LineParam(); lineParam.layerName = txtModelLayer.Text; lineParam.uniqueIdFieldName = cmbID.Text; @@ -149,14 +142,17 @@ lineParam.diameterFieldName = cmbRadius.Text; lineParam.relativeMode = (cmbReference.Text == "管顶") ? 0 : 1; lineParam.lineColor = btnPipelineColor.BackColor; - lineParam.transparency=Convert.ToByte(ComboboxRansparency.Value); + lineParam.transparency = Convert.ToByte(ComboboxRansparency.Value); lineParam.cornerSliceAngle = Convert.ToDouble(textBoxCornerSliceAngle.Text); - lineParam.sliceNum=Convert.ToInt32(txtSlice.Text); + lineParam.sliceNum = Convert.ToInt32(txtSlice.Text); lineParam.channelWidth = comboBoxExWidth.Text; lineParam.channelHeight = comboBoxExHeight.Text; - lineBuilder.build(layer, checkBoxAdd.Checked ? EnumUpdateMode.Append : EnumUpdateMode.Update, - checkBoxDeep.Checked ? EnumBuildMode.Depth : EnumBuildMode.Alititude, lineParam); + if (txtModelLayer.Text != "传感设备图层") + lineBuilder(layer, lineParam); + else + gxLineBuilder(layer, lineParam); + addLayerToGlobeControl(lineParam.layerName); //this.DialogResult = DialogResult.OK; MessageBox.Show("入库完成!", "提示"); @@ -167,6 +163,33 @@ } } + bool getValidateResult(GSOLayer layer) + { + FieldValidate fieldValidate = FieldValidateFactory.Create(ValidateConfig.LoadConfig(), + getEnumValidateType()); + + if (fieldValidate.Validate(layer)) return true; + DateTime dt = DateTime.Now; + string logFilePath = Application.StartupPath + "\\log\\" + dt.Year + "\\" + dt.Year + dt.Month + + "\\" + dt.Year + dt.Month + dt.Day + ".txt"; + MessageBox.Show("选择的数据不符合数据规范,详情见日志" + logFilePath, "提示"); + return false; + } + + void lineBuilder(GSOLayer layer,LineParam lineParam) + { + ModelBuilder lineBuilder = new LineBuilder(datasource); + lineBuilder.build(layer, checkBoxAdd.Checked ? EnumUpdateMode.Append : EnumUpdateMode.Update, + checkBoxDeep.Checked ? EnumBuildMode.Depth : EnumBuildMode.Alititude, lineParam); + } + + void gxLineBuilder(GSOLayer layer, LineParam lineParam) + { + ModelBuilder lineBuilder = new GXBuilder(datasource); + lineBuilder.build(layer, checkBoxAdd.Checked ? EnumUpdateMode.Append : EnumUpdateMode.Update, + checkBoxDeep.Checked ? EnumBuildMode.Depth : EnumBuildMode.Alititude, lineParam); + } + private EnumValidateType getEnumValidateType() { if (comboBoxExWidth.Text != "") diff --git a/LSPipeline.csproj b/LSPipeline.csproj index 477d8ba..599b492 100644 --- a/LSPipeline.csproj +++ b/LSPipeline.csproj @@ -222,6 +222,7 @@ FrmUpdateLayerFieldValues.cs + Form @@ -243,6 +244,7 @@ + True diff --git a/LSPipeline.suo b/LSPipeline.suo index c930f27..92b5d7d 100644 --- a/LSPipeline.suo +++ b/LSPipeline.suo Binary files differ diff --git a/OracleUtils.cs b/OracleUtils.cs new file mode 100644 index 0000000..c79d316 --- /dev/null +++ b/OracleUtils.cs @@ -0,0 +1,1271 @@ +using System; +using System.Collections; +using System.Data; +using System.Data.OracleClient; + +namespace WorldGIS +{ + public abstract class OracleUtils + { + // Read the connection strings from the configuration file + //public static readonly string ConnectionString = System.Configuration.ConfigurationSettings.AppSettings["ConnectionString"]; + public static readonly string ConnectionString = @"Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=" + Utility.DBServer + + ")(PORT=1521))(CONNECT_DATA=(SID=" + Utility.Database + + ")));Persist Security Info=True;User Id=" + Utility.UserID + + "; Password=" + Utility.DBPassword + ""; + + //Create a hashtable for the parameter cached + private static Hashtable parmCache = Hashtable.Synchronized(new Hashtable()); + + #region private utility methods & constructors + + //Since this class provides only static methods, make the default constructor private to prevent + //instances from being created with "new SqlHelper()". + private OracleUtils() { } + + /// + /// This method is used to attach array of SqlParameters to a SqlCommand. + /// + /// This method will assign a value of DbNull to any parameter with a direction of + /// InputOutput and a value of null. + /// + /// This behavior will prevent default values from being used, but + /// this will be the less common case than an intended pure output parameter (derived as InputOutput) + /// where the user provided no input value. + /// + /// The command to which the parameters will be added + /// an array of SqlParameters tho be added to command + private static void AttachParameters(OracleCommand command, OracleParameter[] commandParameters) + { + foreach (OracleParameter p in commandParameters) + { + //check for derived output value with no value assigned + if ((p.Direction == ParameterDirection.InputOutput) && (p.Value == null)) + { + p.Value = DBNull.Value; + } + + command.Parameters.Add(p); + } + } + + /// + /// This method assigns an array of values to an array of SqlParameters. + /// + /// array of SqlParameters to be assigned values + /// array of objects holding the values to be assigned + private static void AssignParameterValues(OracleParameter[] commandParameters, object[] parameterValues) + { + if ((commandParameters == null) || (parameterValues == null)) + { + //do nothing if we get no data + return; + } + + // we must have the same number of values as we pave parameters to put them in + if (commandParameters.Length != parameterValues.Length) + { + throw new ArgumentException("Parameter count does not match Parameter Value count."); + } + + //iterate through the SqlParameters, assigning the values from the corresponding position in the + //value array + for (int i = 0, j = commandParameters.Length; i < j; i++) + { + commandParameters[i].Value = parameterValues[i]; + } + } + + /// + /// This method opens (if necessary) and assigns a connection, transaction, command type and parameters + /// to the provided command. + /// + /// the SqlCommand to be prepared + /// a valid OracleConnection, on which to execute this command + /// a valid OracleTransaction, or 'null' + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an array of SqlParameters to be associated with the command or 'null' if no parameters are required + private static void PrepareCommand(OracleCommand command, OracleConnection connection, OracleTransaction transaction, CommandType commandType, string commandText, OracleParameter[] commandParameters) + { + //if the provided connection is not open, we will open it + if (connection.State != ConnectionState.Open) + { + connection.Open(); + } + + //associate the connection with the command + command.Connection = connection; + + //set the command text (stored procedure name or SQL statement) + command.CommandText = commandText; + + //if we were provided a transaction, assign it. + if (transaction != null) + { + command.Transaction = transaction; + } + + //set the command type + command.CommandType = commandType; + + //attach the command parameters if they are provided + if (commandParameters != null) + { + AttachParameters(command, commandParameters); + } + } + + + #endregion private utility methods & constructors + + #region ExecuteNonQuery + + /// + /// Execute a SqlCommand (that returns no resultset and takes no parameters) against the database specified in + /// the connection string. + /// + /// + /// e.g.: + /// int result = ExecuteNonQuery(connString, CommandType.StoredProcedure, "PublishOrders"); + /// + /// a valid connection string for a OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an int representing the number of rows affected by the command + public static int ExecuteNonQuery(string connectionString, CommandType commandType, string commandText) + { + //pass through the call providing null for the set of SqlParameters + return ExecuteNonQuery(connectionString, commandType, commandText, null); + } + + /// + /// Execute a SqlCommand (that returns no resultset) against the database specified in the connection string + /// using the provided parameters. + /// + /// + /// e.g.: + /// int result = ExecuteNonQuery(connString, CommandType.StoredProcedure, "PublishOrders", new OracleParameter("@prodid", 24)); + /// + /// a valid connection string for a OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an array of SqlParamters used to execute the command + /// an int representing the number of rows affected by the command + public static int ExecuteNonQuery(string connectionString, CommandType commandType, string commandText, params OracleParameter[] commandParameters) + { + //create & open a OracleConnection, and dispose of it after we are done. + using (OracleConnection cn = new OracleConnection(connectionString)) + { + cn.Open(); + + //call the overload that takes a connection in place of the connection string + return ExecuteNonQuery(cn, commandType, commandText, commandParameters); + } + } + + /// + /// Execute a stored procedure via a SqlCommand (that returns no resultset) against the database specified in + /// the connection string using the provided parameter values. This method will query the database to discover the parameters for the + /// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. + /// + /// + /// This method provides no access to output parameters or the stored procedure's return value parameter. + /// + /// e.g.: + /// int result = ExecuteNonQuery(connString, "PublishOrders", 24, 36); + /// + /// a valid connection string for a OracleConnection + /// the name of the stored prcedure + /// an array of objects to be assigned as the input values of the stored procedure + /// an int representing the number of rows affected by the command + public static int ExecuteNonQuery(string connectionString, string spName, params object[] parameterValues) + { + //if we receive parameter values, we need to figure out where they go + if ((parameterValues != null) && (parameterValues.Length > 0)) + { + //pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache) + OracleParameter[] commandParameters = OracleHelperParameterCache.GetSpParameterSet(connectionString, spName); + + //assign the provided values to these parameters based on parameter order + AssignParameterValues(commandParameters, parameterValues); + + //call the overload that takes an array of SqlParameters + return ExecuteNonQuery(connectionString, CommandType.StoredProcedure, spName, commandParameters); + } + //otherwise we can just call the SP without params + return ExecuteNonQuery(connectionString, CommandType.StoredProcedure, spName); + } + + /// + /// Execute a SqlCommand (that returns no resultset and takes no parameters) against the provided OracleConnection. + /// + /// + /// e.g.: + /// int result = ExecuteNonQuery(conn, CommandType.StoredProcedure, "PublishOrders"); + /// + /// a valid OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an int representing the number of rows affected by the command + public static int ExecuteNonQuery(OracleConnection connection, CommandType commandType, string commandText) + { + //pass through the call providing null for the set of SqlParameters + return ExecuteNonQuery(connection, commandType, commandText, null); + } + + /// + /// Execute a SqlCommand (that returns no resultset) against the specified OracleConnection + /// using the provided parameters. + /// + /// + /// e.g.: + /// int result = ExecuteNonQuery(conn, CommandType.StoredProcedure, "PublishOrders", new OracleParameter("@prodid", 24)); + /// + /// a valid OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an array of SqlParamters used to execute the command + /// an int representing the number of rows affected by the command + public static int ExecuteNonQuery(OracleConnection connection, CommandType commandType, string commandText, params OracleParameter[] commandParameters) + { + //create a command and prepare it for execution + + OracleCommand cmd = new OracleCommand(); + PrepareCommand(cmd, connection, null, commandType, commandText, commandParameters); + + //finally, execute the command. + int retval = cmd.ExecuteNonQuery(); + + // detach the SqlParameters from the command object, so they can be used again. + cmd.Parameters.Clear(); + return retval; + } + + public static int ExecuteNonQueryWithTimeout(string connectionString, CommandType commandType, string commandText, int cmdTimeout) + { + //create a command and prepare it for execution + using (OracleConnection cn = new OracleConnection(connectionString)) + { + cn.Open(); + OracleCommand cmd = new OracleCommand(); + PrepareCommand(cmd, cn, null, commandType, commandText, null); + cmd.CommandTimeout = cmdTimeout; + //finally, execute the command. + int retval = cmd.ExecuteNonQuery(); + + // detach the SqlParameters from the command object, so they can be used again. + cmd.Parameters.Clear(); + return retval; + } + + } + /// + /// Execute a stored procedure via a SqlCommand (that returns no resultset) against the specified OracleConnection + /// using the provided parameter values. This method will query the database to discover the parameters for the + /// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. + /// + /// + /// This method provides no access to output parameters or the stored procedure's return value parameter. + /// + /// e.g.: + /// int result = ExecuteNonQuery(conn, "PublishOrders", 24, 36); + /// + /// a valid OracleConnection + /// the name of the stored procedure + /// an array of objects to be assigned as the input values of the stored procedure + /// an int representing the number of rows affected by the command + public static int ExecuteNonQuery(OracleConnection connection, string spName, params object[] parameterValues) + { + //if we receive parameter values, we need to figure out where they go + if ((parameterValues != null) && (parameterValues.Length > 0)) + { + //pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache) + OracleParameter[] commandParameters = OracleHelperParameterCache.GetSpParameterSet(connection.ConnectionString, spName); + + //assign the provided values to these parameters based on parameter order + AssignParameterValues(commandParameters, parameterValues); + + //call the overload that takes an array of SqlParameters + return ExecuteNonQuery(connection, CommandType.StoredProcedure, spName, commandParameters); + } + //otherwise we can just call the SP without params + return ExecuteNonQuery(connection, CommandType.StoredProcedure, spName); + } + + /// + /// Execute a SqlCommand (that returns no resultset and takes no parameters) against the provided OracleTransaction. + /// + /// + /// e.g.: + /// int result = ExecuteNonQuery(trans, CommandType.StoredProcedure, "PublishOrders"); + /// + /// a valid OracleTransaction + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an int representing the number of rows affected by the command + public static int ExecuteNonQuery(OracleTransaction transaction, CommandType commandType, string commandText) + { + //pass through the call providing null for the set of SqlParameters + return ExecuteNonQuery(transaction, commandType, commandText, null); + } + + /// + /// Execute a SqlCommand (that returns no resultset) against the specified OracleTransaction + /// using the provided parameters. + /// + /// + /// e.g.: + /// int result = ExecuteNonQuery(trans, CommandType.StoredProcedure, "GetOrders", new OracleParameter("@prodid", 24)); + /// + /// a valid OracleTransaction + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an array of SqlParamters used to execute the command + /// an int representing the number of rows affected by the command + public static int ExecuteNonQuery(OracleTransaction transaction, CommandType commandType, string commandText, params OracleParameter[] commandParameters) + { + //create a command and prepare it for execution + OracleCommand cmd = new OracleCommand(); + PrepareCommand(cmd, transaction.Connection, transaction, commandType, commandText, commandParameters); + + //finally, execute the command. + int retval = cmd.ExecuteNonQuery(); + + // detach the SqlParameters from the command object, so they can be used again. + cmd.Parameters.Clear(); + return retval; + } + + /// + /// Execute a stored procedure via a SqlCommand (that returns no resultset) against the specified + /// OracleTransaction using the provided parameter values. This method will query the database to discover the parameters for the + /// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. + /// + /// + /// This method provides no access to output parameters or the stored procedure's return value parameter. + /// + /// e.g.: + /// int result = ExecuteNonQuery(conn, trans, "PublishOrders", 24, 36); + /// + /// a valid OracleTransaction + /// the name of the stored procedure + /// an array of objects to be assigned as the input values of the stored procedure + /// an int representing the number of rows affected by the command + public static int ExecuteNonQuery(OracleTransaction transaction, string spName, params object[] parameterValues) + { + //if we receive parameter values, we need to figure out where they go + if ((parameterValues != null) && (parameterValues.Length > 0)) + { + //pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache) + OracleParameter[] commandParameters = OracleHelperParameterCache.GetSpParameterSet(transaction.Connection.ConnectionString, spName); + + //assign the provided values to these parameters based on parameter order + AssignParameterValues(commandParameters, parameterValues); + + //call the overload that takes an array of SqlParameters + return ExecuteNonQuery(transaction, CommandType.StoredProcedure, spName, commandParameters); + } + //otherwise we can just call the SP without params + return ExecuteNonQuery(transaction, CommandType.StoredProcedure, spName); + } + + + #endregion ExecuteNonQuery + + #region ExecuteDataSet + + /// + /// Execute a SqlCommand (that returns a resultset and takes no parameters) against the database specified in + /// the connection string. + /// + /// + /// e.g.: + /// DataSet ds = ExecuteDataset(connString, CommandType.StoredProcedure, "GetOrders"); + /// + /// a valid connection string for a OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// a dataset containing the resultset generated by the command + public static DataSet ExecuteDataset(string connectionString, CommandType commandType, string commandText) + { + //pass through the call providing null for the set of SqlParameters + return ExecuteDataset(connectionString, commandType, commandText, null); + } + + /// + /// Execute a SqlCommand (that returns a resultset) against the database specified in the connection string + /// using the provided parameters. + /// + /// + /// e.g.: + /// DataSet ds = ExecuteDataset(connString, CommandType.StoredProcedure, "GetOrders", new OracleParameter("@prodid", 24)); + /// + /// a valid connection string for a OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an array of SqlParamters used to execute the command + /// a dataset containing the resultset generated by the command + public static DataSet ExecuteDataset(string connectionString, CommandType commandType, string commandText, params OracleParameter[] commandParameters) + { + //create & open a OracleConnection, and dispose of it after we are done. + using (OracleConnection cn = new OracleConnection(connectionString)) + { + cn.Open(); + + //call the overload that takes a connection in place of the connection string + return ExecuteDataset(cn, commandType, commandText, commandParameters); + } + } + + /// + /// Execute a stored procedure via a SqlCommand (that returns a resultset) against the database specified in + /// the connection string using the provided parameter values. This method will query the database to discover the parameters for the + /// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. + /// + /// + /// This method provides no access to output parameters or the stored procedure's return value parameter. + /// + /// e.g.: + /// DataSet ds = ExecuteDataset(connString, "GetOrders", 24, 36); + /// + /// a valid connection string for a OracleConnection + /// the name of the stored procedure + /// an array of objects to be assigned as the input values of the stored procedure + /// a dataset containing the resultset generated by the command + public static DataSet ExecuteDataset(string connectionString, string spName, params object[] parameterValues) + { + //if we receive parameter values, we need to figure out where they go + if ((parameterValues != null) && (parameterValues.Length > 0)) + { + //pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache) + OracleParameter[] commandParameters = OracleHelperParameterCache.GetSpParameterSet(connectionString, spName); + + //assign the provided values to these parameters based on parameter order + AssignParameterValues(commandParameters, parameterValues); + + //call the overload that takes an array of SqlParameters + return ExecuteDataset(connectionString, CommandType.StoredProcedure, spName, commandParameters); + } + //otherwise we can just call the SP without params + return ExecuteDataset(connectionString, CommandType.StoredProcedure, spName); + } + + /// + /// Execute a SqlCommand (that returns a resultset and takes no parameters) against the provided OracleConnection. + /// + /// + /// e.g.: + /// DataSet ds = ExecuteDataset(conn, CommandType.StoredProcedure, "GetOrders"); + /// + /// a valid OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// a dataset containing the resultset generated by the command + public static DataSet ExecuteDataset(OracleConnection connection, CommandType commandType, string commandText) + { + //pass through the call providing null for the set of SqlParameters + return ExecuteDataset(connection, commandType, commandText, null); + } + + /// + /// Execute a SqlCommand (that returns a resultset) against the specified OracleConnection + /// using the provided parameters. + /// + /// + /// e.g.: + /// DataSet ds = ExecuteDataset(conn, CommandType.StoredProcedure, "GetOrders", new OracleParameter("@prodid", 24)); + /// + /// a valid OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an array of SqlParamters used to execute the command + /// a dataset containing the resultset generated by the command + public static DataSet ExecuteDataset(OracleConnection connection, CommandType commandType, string commandText, params OracleParameter[] commandParameters) + { + //create a command and prepare it for execution + OracleCommand cmd = new OracleCommand(); + PrepareCommand(cmd, connection, null, commandType, commandText, commandParameters); + + //create the DataAdapter & DataSet + OracleDataAdapter da = new OracleDataAdapter(cmd); + DataSet ds = new DataSet(); + + //fill the DataSet using default values for DataTable names, etc. + da.Fill(ds); + + // detach the SqlParameters from the command object, so they can be used again. + cmd.Parameters.Clear(); + + //return the dataset + return ds; + } + + /// + /// Execute a stored procedure via a SqlCommand (that returns a resultset) against the specified OracleConnection + /// using the provided parameter values. This method will query the database to discover the parameters for the + /// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. + /// + /// + /// This method provides no access to output parameters or the stored procedure's return value parameter. + /// + /// e.g.: + /// DataSet ds = ExecuteDataset(conn, "GetOrders", 24, 36); + /// + /// a valid OracleConnection + /// the name of the stored procedure + /// an array of objects to be assigned as the input values of the stored procedure + /// a dataset containing the resultset generated by the command + public static DataSet ExecuteDataset(OracleConnection connection, string spName, params object[] parameterValues) + { + //if we receive parameter values, we need to figure out where they go + if ((parameterValues != null) && (parameterValues.Length > 0)) + { + //pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache) + OracleParameter[] commandParameters = OracleHelperParameterCache.GetSpParameterSet(connection.ConnectionString, spName); + + //assign the provided values to these parameters based on parameter order + AssignParameterValues(commandParameters, parameterValues); + + //call the overload that takes an array of SqlParameters + return ExecuteDataset(connection, CommandType.StoredProcedure, spName, commandParameters); + } + //otherwise we can just call the SP without params + return ExecuteDataset(connection, CommandType.StoredProcedure, spName); + } + + /// + /// Execute a SqlCommand (that returns a resultset and takes no parameters) against the provided OracleTransaction. + /// + /// + /// e.g.: + /// DataSet ds = ExecuteDataset(trans, CommandType.StoredProcedure, "GetOrders"); + /// + /// a valid OracleTransaction + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// a dataset containing the resultset generated by the command + public static DataSet ExecuteDataset(OracleTransaction transaction, CommandType commandType, string commandText) + { + //pass through the call providing null for the set of SqlParameters + return ExecuteDataset(transaction, commandType, commandText, null); + } + + /// + /// Execute a SqlCommand (that returns a resultset) against the specified OracleTransaction + /// using the provided parameters. + /// + /// + /// e.g.: + /// DataSet ds = ExecuteDataset(trans, CommandType.StoredProcedure, "GetOrders", new OracleParameter("@prodid", 24)); + /// + /// a valid OracleTransaction + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an array of SqlParamters used to execute the command + /// a dataset containing the resultset generated by the command + public static DataSet ExecuteDataset(OracleTransaction transaction, CommandType commandType, string commandText, params OracleParameter[] commandParameters) + { + //create a command and prepare it for execution + OracleCommand cmd = new OracleCommand(); + PrepareCommand(cmd, transaction.Connection, transaction, commandType, commandText, commandParameters); + + //create the DataAdapter & DataSet + OracleDataAdapter da = new OracleDataAdapter(cmd); + DataSet ds = new DataSet(); + + //fill the DataSet using default values for DataTable names, etc. + da.Fill(ds); + + // detach the SqlParameters from the command object, so they can be used again. + cmd.Parameters.Clear(); + + //return the dataset + return ds; + } + + /// + /// Execute a stored procedure via a SqlCommand (that returns a resultset) against the specified + /// OracleTransaction using the provided parameter values. This method will query the database to discover the parameters for the + /// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. + /// + /// + /// This method provides no access to output parameters or the stored procedure's return value parameter. + /// + /// e.g.: + /// DataSet ds = ExecuteDataset(trans, "GetOrders", 24, 36); + /// + /// a valid OracleTransaction + /// the name of the stored procedure + /// an array of objects to be assigned as the input values of the stored procedure + /// a dataset containing the resultset generated by the command + public static DataSet ExecuteDataset(OracleTransaction transaction, string spName, params object[] parameterValues) + { + //if we receive parameter values, we need to figure out where they go + if ((parameterValues != null) && (parameterValues.Length > 0)) + { + //pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache) + OracleParameter[] commandParameters = OracleHelperParameterCache.GetSpParameterSet(transaction.Connection.ConnectionString, spName); + + //assign the provided values to these parameters based on parameter order + AssignParameterValues(commandParameters, parameterValues); + + //call the overload that takes an array of SqlParameters + return ExecuteDataset(transaction, CommandType.StoredProcedure, spName, commandParameters); + } + //otherwise we can just call the SP without params + return ExecuteDataset(transaction, CommandType.StoredProcedure, spName); + } + + #endregion ExecuteDataSet + + #region ExecuteReader + + /// + /// this enum is used to indicate whether the connection was provided by the caller, or created by SqlHelper, so that + /// we can set the appropriate CommandBehavior when calling ExecuteReader() + /// + private enum OracleConnectionOwnership + { + /// Connection is owned and managed by SqlHelper + Internal, + /// Connection is owned and managed by the caller + External + } + + /// + /// Create and prepare a SqlCommand, and call ExecuteReader with the appropriate CommandBehavior. + /// + /// + /// If we created and opened the connection, we want the connection to be closed when the DataReader is closed. + /// + /// If the caller provided the connection, we want to leave it to them to manage. + /// + /// a valid OracleConnection, on which to execute this command + /// a valid OracleTransaction, or 'null' + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an array of SqlParameters to be associated with the command or 'null' if no parameters are required + /// indicates whether the connection parameter was provided by the caller, or created by SqlHelper + /// SqlDataReader containing the results of the command + private static OracleDataReader ExecuteReader(OracleConnection connection, OracleTransaction transaction, CommandType commandType, string commandText, OracleParameter[] commandParameters, OracleConnectionOwnership connectionOwnership) + { + //create a command and prepare it for execution + OracleCommand cmd = new OracleCommand(); + PrepareCommand(cmd, connection, transaction, commandType, commandText, commandParameters); + + //create a reader + OracleDataReader dr; + + // call ExecuteReader with the appropriate CommandBehavior + if (connectionOwnership == OracleConnectionOwnership.External) + { + dr = cmd.ExecuteReader(); + } + else + { + dr = cmd.ExecuteReader(CommandBehavior.CloseConnection); + + } + + // detach the SqlParameters from the command object, so they can be used again. + cmd.Parameters.Clear(); + + return dr; + } + + /// + /// Execute a SqlCommand (that returns a resultset and takes no parameters) against the database specified in + /// the connection string. + /// + /// + /// e.g.: + /// SqlDataReader dr = ExecuteReader(connString, CommandType.StoredProcedure, "GetOrders"); + /// + /// a valid connection string for a OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// a SqlDataReader containing the resultset generated by the command + public static OracleDataReader ExecuteReader(string connectionString, CommandType commandType, string commandText) + { + //pass through the call providing null for the set of SqlParameters + return ExecuteReader(connectionString, commandType, commandText, null); + } + + /// + /// Execute a SqlCommand (that returns a resultset) against the database specified in the connection string + /// using the provided parameters. + /// + /// + /// e.g.: + /// SqlDataReader dr = ExecuteReader(connString, CommandType.StoredProcedure, "GetOrders", new OracleParameter("@prodid", 24)); + /// + /// a valid connection string for a OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an array of SqlParamters used to execute the command + /// a SqlDataReader containing the resultset generated by the command + public static OracleDataReader ExecuteReader(string connectionString, CommandType commandType, string commandText, params OracleParameter[] commandParameters) + { + //create & open a OracleConnection + OracleConnection cn = new OracleConnection(connectionString); + cn.Open(); + + try + { + //call the private overload that takes an internally owned connection in place of the connection string + return ExecuteReader(cn, null, commandType, commandText, commandParameters, OracleConnectionOwnership.Internal); + } + catch + { + //if we fail to return the SqlDatReader, we need to close the connection ourselves + cn.Close(); + throw; + } + } + + /// + /// Execute a stored procedure via a SqlCommand (that returns a resultset) against the database specified in + /// the connection string using the provided parameter values. This method will query the database to discover the parameters for the + /// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. + /// + /// + /// This method provides no access to output parameters or the stored procedure's return value parameter. + /// + /// e.g.: + /// SqlDataReader dr = ExecuteReader(connString, "GetOrders", 24, 36); + /// + /// a valid connection string for a OracleConnection + /// the name of the stored procedure + /// an array of objects to be assigned as the input values of the stored procedure + /// a SqlDataReader containing the resultset generated by the command + public static OracleDataReader ExecuteReader(string connectionString, string spName, params object[] parameterValues) + { + //if we receive parameter values, we need to figure out where they go + if ((parameterValues != null) && (parameterValues.Length > 0)) + { + //pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache) + OracleParameter[] commandParameters = OracleHelperParameterCache.GetSpParameterSet(connectionString, spName); + + //assign the provided values to these parameters based on parameter order + AssignParameterValues(commandParameters, parameterValues); + + //call the overload that takes an array of SqlParameters + return ExecuteReader(connectionString, CommandType.StoredProcedure, spName, commandParameters); + } + //otherwise we can just call the SP without params + return ExecuteReader(connectionString, CommandType.StoredProcedure, spName); + } + + /// + /// Execute a SqlCommand (that returns a resultset and takes no parameters) against the provided OracleConnection. + /// + /// + /// e.g.: + /// SqlDataReader dr = ExecuteReader(conn, CommandType.StoredProcedure, "GetOrders"); + /// + /// a valid OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// a SqlDataReader containing the resultset generated by the command + public static OracleDataReader ExecuteReader(OracleConnection connection, CommandType commandType, string commandText) + { + //pass through the call providing null for the set of SqlParameters + return ExecuteReader(connection, commandType, commandText, null); + } + + /// + /// Execute a SqlCommand (that returns a resultset) against the specified OracleConnection + /// using the provided parameters. + /// + /// + /// e.g.: + /// SqlDataReader dr = ExecuteReader(conn, CommandType.StoredProcedure, "GetOrders", new OracleParameter("@prodid", 24)); + /// + /// a valid OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an array of SqlParamters used to execute the command + /// a SqlDataReader containing the resultset generated by the command + public static OracleDataReader ExecuteReader(OracleConnection connection, CommandType commandType, string commandText, params OracleParameter[] commandParameters) + { + //pass through the call to the private overload using a null transaction value and an externally owned connection + return ExecuteReader(connection, null, commandType, commandText, commandParameters, OracleConnectionOwnership.External); + } + + /// + /// Execute a stored procedure via a SqlCommand (that returns a resultset) against the specified OracleConnection + /// using the provided parameter values. This method will query the database to discover the parameters for the + /// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. + /// + /// + /// This method provides no access to output parameters or the stored procedure's return value parameter. + /// + /// e.g.: + /// SqlDataReader dr = ExecuteReader(conn, "GetOrders", 24, 36); + /// + /// a valid OracleConnection + /// the name of the stored procedure + /// an array of objects to be assigned as the input values of the stored procedure + /// a SqlDataReader containing the resultset generated by the command + public static OracleDataReader ExecuteReader(OracleConnection connection, string spName, params object[] parameterValues) + { + //if we receive parameter values, we need to figure out where they go + if ((parameterValues != null) && (parameterValues.Length > 0)) + { + OracleParameter[] commandParameters = OracleHelperParameterCache.GetSpParameterSet(connection.ConnectionString, spName); + + AssignParameterValues(commandParameters, parameterValues); + + return ExecuteReader(connection, CommandType.StoredProcedure, spName, commandParameters); + } + //otherwise we can just call the SP without params + return ExecuteReader(connection, CommandType.StoredProcedure, spName); + } + + /// + /// Execute a SqlCommand (that returns a resultset and takes no parameters) against the provided OracleTransaction. + /// + /// + /// e.g.: + /// SqlDataReader dr = ExecuteReader(trans, CommandType.StoredProcedure, "GetOrders"); + /// + /// a valid OracleTransaction + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// a SqlDataReader containing the resultset generated by the command + public static OracleDataReader ExecuteReader(OracleTransaction transaction, CommandType commandType, string commandText) + { + //pass through the call providing null for the set of SqlParameters + return ExecuteReader(transaction, commandType, commandText, null); + } + + /// + /// Execute a SqlCommand (that returns a resultset) against the specified OracleTransaction + /// using the provided parameters. + /// + /// + /// e.g.: + /// SqlDataReader dr = ExecuteReader(trans, CommandType.StoredProcedure, "GetOrders", new OracleParameter("@prodid", 24)); + /// + /// a valid OracleTransaction + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an array of SqlParamters used to execute the command + /// a SqlDataReader containing the resultset generated by the command + public static OracleDataReader ExecuteReader(OracleTransaction transaction, CommandType commandType, string commandText, params OracleParameter[] commandParameters) + { + //pass through to private overload, indicating that the connection is owned by the caller + return ExecuteReader(transaction.Connection, transaction, commandType, commandText, commandParameters, OracleConnectionOwnership.External); + } + + /// + /// Execute a stored procedure via a SqlCommand (that returns a resultset) against the specified + /// OracleTransaction using the provided parameter values. This method will query the database to discover the parameters for the + /// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. + /// + /// + /// This method provides no access to output parameters or the stored procedure's return value parameter. + /// + /// e.g.: + /// SqlDataReader dr = ExecuteReader(trans, "GetOrders", 24, 36); + /// + /// a valid OracleTransaction + /// the name of the stored procedure + /// an array of objects to be assigned as the input values of the stored procedure + /// a SqlDataReader containing the resultset generated by the command + public static OracleDataReader ExecuteReader(OracleTransaction transaction, string spName, params object[] parameterValues) + { + //if we receive parameter values, we need to figure out where they go + if ((parameterValues != null) && (parameterValues.Length > 0)) + { + OracleParameter[] commandParameters = OracleHelperParameterCache.GetSpParameterSet(transaction.Connection.ConnectionString, spName); + + AssignParameterValues(commandParameters, parameterValues); + + return ExecuteReader(transaction, CommandType.StoredProcedure, spName, commandParameters); + } + //otherwise we can just call the SP without params + return ExecuteReader(transaction, CommandType.StoredProcedure, spName); + } + + #endregion ExecuteReader + + #region ExecuteScalar + + /// + /// Execute a OracleCommand (that returns a 1x1 resultset and takes no parameters) against the database specified in + /// the connection string. + /// + /// + /// e.g.: + /// int orderCount = (int)ExecuteScalar(connString, CommandType.StoredProcedure, "GetOrderCount"); + /// + /// a valid connection string for a OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an object containing the value in the 1x1 resultset generated by the command + public static object ExecuteScalar(string connectionString, CommandType commandType, string commandText) + { + //pass through the call providing null for the set of SqlParameters + return ExecuteScalar(connectionString, commandType, commandText, null); + } + + /// + /// Execute a OracleCommand (that returns a 1x1 resultset) against the database specified in the connection string + /// using the provided parameters. + /// + /// + /// e.g.: + /// int orderCount = (int)ExecuteScalar(connString, CommandType.StoredProcedure, "GetOrderCount", new OracleParameter("@prodid", 24)); + /// + /// a valid connection string for a OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an array of SqlParamters used to execute the command + /// an object containing the value in the 1x1 resultset generated by the command + public static object ExecuteScalar(string connectionString, CommandType commandType, string commandText, params OracleParameter[] commandParameters) + { + //create & open a OracleConnection, and dispose of it after we are done. + using (OracleConnection cn = new OracleConnection(connectionString)) + { + cn.Open(); + + //call the overload that takes a connection in place of the connection string + return ExecuteScalar(cn, commandType, commandText, commandParameters); + } + } + + /// + /// Execute a stored procedure via a OracleCommand (that returns a 1x1 resultset) against the database specified in + /// the connection string using the provided parameter values. This method will query the database to discover the parameters for the + /// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. + /// + /// + /// This method provides no access to output parameters or the stored procedure's return value parameter. + /// + /// e.g.: + /// int orderCount = (int)ExecuteScalar(connString, "GetOrderCount", 24, 36); + /// + /// a valid connection string for a OracleConnection + /// the name of the stored procedure + /// an array of objects to be assigned as the input values of the stored procedure + /// an object containing the value in the 1x1 resultset generated by the command + public static object ExecuteScalar(string connectionString, string spName, params object[] parameterValues) + { + //if we receive parameter values, we need to figure out where they go + if ((parameterValues != null) && (parameterValues.Length > 0)) + { + //pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache) + OracleParameter[] commandParameters = OracleHelperParameterCache.GetSpParameterSet(connectionString, spName); + + //assign the provided values to these parameters based on parameter order + AssignParameterValues(commandParameters, parameterValues); + + //call the overload that takes an array of SqlParameters + return ExecuteScalar(connectionString, CommandType.StoredProcedure, spName, commandParameters); + } + //otherwise we can just call the SP without params + return ExecuteScalar(connectionString, CommandType.StoredProcedure, spName); + } + + /// + /// Execute a OracleCommand (that returns a 1x1 resultset and takes no parameters) against the provided OracleConnection. + /// + /// + /// e.g.: + /// int orderCount = (int)ExecuteScalar(conn, CommandType.StoredProcedure, "GetOrderCount"); + /// + /// a valid OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an object containing the value in the 1x1 resultset generated by the command + public static object ExecuteScalar(OracleConnection connection, CommandType commandType, string commandText) + { + //pass through the call providing null for the set of SqlParameters + return ExecuteScalar(connection, commandType, commandText, null); + } + + /// + /// Execute a OracleCommand (that returns a 1x1 resultset) against the specified OracleConnection + /// using the provided parameters. + /// + /// + /// e.g.: + /// int orderCount = (int)ExecuteScalar(conn, CommandType.StoredProcedure, "GetOrderCount", new OracleParameter("@prodid", 24)); + /// + /// a valid OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an array of SqlParamters used to execute the command + /// an object containing the value in the 1x1 resultset generated by the command + public static object ExecuteScalar(OracleConnection connection, CommandType commandType, string commandText, params OracleParameter[] commandParameters) + { + //create a command and prepare it for execution + OracleCommand cmd = new OracleCommand(); + PrepareCommand(cmd, connection, null, commandType, commandText, commandParameters); + + //execute the command & return the results + object retval = cmd.ExecuteScalar(); + + // detach the SqlParameters from the command object, so they can be used again. + cmd.Parameters.Clear(); + return retval; + + } + + /// + /// Execute a stored procedure via a OracleCommand (that returns a 1x1 resultset) against the specified OracleConnection + /// using the provided parameter values. This method will query the database to discover the parameters for the + /// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. + /// + /// + /// This method provides no access to output parameters or the stored procedure's return value parameter. + /// + /// e.g.: + /// int orderCount = (int)ExecuteScalar(conn, "GetOrderCount", 24, 36); + /// + /// a valid OracleConnection + /// the name of the stored procedure + /// an array of objects to be assigned as the input values of the stored procedure + /// an object containing the value in the 1x1 resultset generated by the command + public static object ExecuteScalar(OracleConnection connection, string spName, params object[] parameterValues) + { + //if we receive parameter values, we need to figure out where they go + if ((parameterValues != null) && (parameterValues.Length > 0)) + { + //pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache) + OracleParameter[] commandParameters = OracleHelperParameterCache.GetSpParameterSet(connection.ConnectionString, spName); + + //assign the provided values to these parameters based on parameter order + AssignParameterValues(commandParameters, parameterValues); + + //call the overload that takes an array of SqlParameters + return ExecuteScalar(connection, CommandType.StoredProcedure, spName, commandParameters); + } + //otherwise we can just call the SP without params + return ExecuteScalar(connection, CommandType.StoredProcedure, spName); + } + + /// + /// Execute a OracleCommand (that returns a 1x1 resultset and takes no parameters) against the provided OracleTransaction. + /// + /// + /// e.g.: + /// int orderCount = (int)ExecuteScalar(trans, CommandType.StoredProcedure, "GetOrderCount"); + /// + /// a valid OracleTransaction + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an object containing the value in the 1x1 resultset generated by the command + public static object ExecuteScalar(OracleTransaction transaction, CommandType commandType, string commandText) + { + //pass through the call providing null for the set of SqlParameters + return ExecuteScalar(transaction, commandType, commandText, null); + } + + /// + /// Execute a OracleCommand (that returns a 1x1 resultset) against the specified OracleTransaction + /// using the provided parameters. + /// + /// + /// e.g.: + /// int orderCount = (int)ExecuteScalar(trans, CommandType.StoredProcedure, "GetOrderCount", new OracleParameter("@prodid", 24)); + /// + /// a valid OracleTransaction + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an array of SqlParamters used to execute the command + /// an object containing the value in the 1x1 resultset generated by the command + public static object ExecuteScalar(OracleTransaction transaction, CommandType commandType, string commandText, params OracleParameter[] commandParameters) + { + //create a command and prepare it for execution + OracleCommand cmd = new OracleCommand(); + PrepareCommand(cmd, transaction.Connection, transaction, commandType, commandText, commandParameters); + + //execute the command & return the results + object retval = cmd.ExecuteScalar(); + + // detach the SqlParameters from the command object, so they can be used again. + cmd.Parameters.Clear(); + return retval; + } + + /// + /// Execute a stored procedure via a OracleCommand (that returns a 1x1 resultset) against the specified + /// OracleTransaction using the provided parameter values. This method will query the database to discover the parameters for the + /// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. + /// + /// + /// This method provides no access to output parameters or the stored procedure's return value parameter. + /// + /// e.g.: + /// int orderCount = (int)ExecuteScalar(trans, "GetOrderCount", 24, 36); + /// + /// a valid OracleTransaction + /// the name of the stored procedure + /// an array of objects to be assigned as the input values of the stored procedure + /// an object containing the value in the 1x1 resultset generated by the command + public static object ExecuteScalar(OracleTransaction transaction, string spName, params object[] parameterValues) + { + //if we receive parameter values, we need to figure out where they go + if ((parameterValues != null) && (parameterValues.Length > 0)) + { + //pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache) + OracleParameter[] commandParameters = OracleHelperParameterCache.GetSpParameterSet(transaction.Connection.ConnectionString, spName); + + //assign the provided values to these parameters based on parameter order + AssignParameterValues(commandParameters, parameterValues); + + //call the overload that takes an array of SqlParameters + return ExecuteScalar(transaction, CommandType.StoredProcedure, spName, commandParameters); + } + //otherwise we can just call the SP without params + return ExecuteScalar(transaction, CommandType.StoredProcedure, spName); + } + + #endregion ExecuteScalar + + + } + /// + /// OracleHelperParameterCache provides functions to leverage a static cache of procedure parameters, and the + /// ability to discover parameters for stored procedures at run-time. + /// + /// + + public sealed class OracleHelperParameterCache + { + #region private methods, variables, and constructors + + //Since this class provides only static methods, make the default constructor private to prevent + //instances from being created with "new SqlHelperParameterCache()". + private OracleHelperParameterCache() { } + + private static Hashtable paramCache = Hashtable.Synchronized(new Hashtable()); + + /// + /// resolve at run time the appropriate set of SqlParameters for a stored procedure + /// + /// a valid connection string for a OracleConnection + /// the name of the stored procedure + /// whether or not to include their return value parameter + /// + private static OracleParameter[] DiscoverSpParameterSet(string connectionString, string spName, bool includeReturnValueParameter) + { + using (OracleConnection cn = new OracleConnection(connectionString)) + using (OracleCommand cmd = new OracleCommand(spName, cn)) + { + cn.Open(); + cmd.CommandType = CommandType.StoredProcedure; + OracleCommandBuilder.DeriveParameters(cmd); + + if (!includeReturnValueParameter) + { + cmd.Parameters.RemoveAt(0); + } + + OracleParameter[] discoveredParameters = new OracleParameter[cmd.Parameters.Count]; ; + + cmd.Parameters.CopyTo(discoveredParameters, 0); + + return discoveredParameters; + } + } + + //deep copy of cached OracleParameter array + private static OracleParameter[] CloneParameters(OracleParameter[] originalParameters) + { + OracleParameter[] clonedParameters = new OracleParameter[originalParameters.Length]; + + for (int i = 0, j = originalParameters.Length; i < j; i++) + { + clonedParameters[i] = (OracleParameter)((ICloneable)originalParameters[i]).Clone(); + } + + return clonedParameters; + } + + #endregion private methods, variables, and constructors + + #region caching functions + + /// + /// add parameter array to the cache + /// + /// a valid connection string for a OracleConnection + /// the stored procedure name or T-SQL command + /// an array of SqlParamters to be cached + public static void CacheParameterSet(string connectionString, string commandText, params OracleParameter[] commandParameters) + { + string hashKey = connectionString + ":" + commandText; + + paramCache[hashKey] = commandParameters; + } + + /// + /// retrieve a parameter array from the cache + /// + /// a valid connection string for a OracleConnection + /// the stored procedure name or T-SQL command + /// an array of SqlParamters + public static OracleParameter[] GetCachedParameterSet(string connectionString, string commandText) + { + string hashKey = connectionString + ":" + commandText; + + OracleParameter[] cachedParameters = (OracleParameter[])paramCache[hashKey]; + + if (cachedParameters == null) + { + return null; + } + return CloneParameters(cachedParameters); + } + + #endregion caching functions + + #region Parameter Discovery Functions + + /// + /// Retrieves the set of SqlParameters appropriate for the stored procedure + /// + /// + /// This method will query the database for this information, and then store it in a cache for future requests. + /// + /// a valid connection string for a OracleConnection + /// the name of the stored procedure + /// an array of SqlParameters + public static OracleParameter[] GetSpParameterSet(string connectionString, string spName) + { + return GetSpParameterSet(connectionString, spName, false); + } + + /// + /// Retrieves the set of SqlParameters appropriate for the stored procedure + /// + /// + /// This method will query the database for this information, and then store it in a cache for future requests. + /// + /// a valid connection string for a OracleConnection + /// the name of the stored procedure + /// a bool value indicating whether the return value parameter should be included in the results + /// an array of SqlParameters + public static OracleParameter[] GetSpParameterSet(string connectionString, string spName, bool includeReturnValueParameter) + { + string hashKey = connectionString + ":" + spName + (includeReturnValueParameter ? ":include ReturnValue Parameter" : ""); + + OracleParameter[] cachedParameters; + + cachedParameters = (OracleParameter[])paramCache[hashKey]; + + if (cachedParameters == null) + { + cachedParameters = (OracleParameter[])(paramCache[hashKey] = DiscoverSpParameterSet(connectionString, spName, includeReturnValueParameter)); + } + + return CloneParameters(cachedParameters); + } + + #endregion Parameter Discovery Functions + } +} diff --git a/Utility.cs b/Utility.cs index 1429fd9..4e64d66 100644 --- a/Utility.cs +++ b/Utility.cs @@ -17,6 +17,11 @@ { public class Utility { + public static string DBServer; + public static string Database; + public static string UserID; + public static string DBPassword; + public static void SetBallons(GSOBalloon featureTooltip,GSOBalloonEx balloonEx) { featureTooltip.CacheFilePath = Path.GetDirectoryName(Application.ExecutablePath) + "/GeoScene/Globe/Temp"; diff --git a/bin/x64/Debug/LSPipeline.exe b/bin/x64/Debug/LSPipeline.exe index 833a5e5..76f838b 100644 --- a/bin/x64/Debug/LSPipeline.exe +++ b/bin/x64/Debug/LSPipeline.exe Binary files differ diff --git a/bin/x64/Debug/LSPipeline.pdb b/bin/x64/Debug/LSPipeline.pdb index 245e727..28c81dc 100644 --- a/bin/x64/Debug/LSPipeline.pdb +++ b/bin/x64/Debug/LSPipeline.pdb Binary files differ diff --git a/bin/x64/Debug/databaseConfigOracle.xml b/bin/x64/Debug/databaseConfigOracle.xml index 7e48b08..94be70c 100644 --- a/bin/x64/Debug/databaseConfigOracle.xml +++ b/bin/x64/Debug/databaseConfigOracle.xml @@ -2,7 +2,7 @@ True 192.168.0.203 - szhtdb2 - release - release + eydb2 + scott + scott \ No newline at end of file diff --git a/FrmDatabaseParaSettingOracle.cs b/FrmDatabaseParaSettingOracle.cs index 18c5e99..6e97dfb 100644 --- a/FrmDatabaseParaSettingOracle.cs +++ b/FrmDatabaseParaSettingOracle.cs @@ -47,12 +47,15 @@ } string serverIp = textBoxIP.Text.Trim(); + /* string hostName = System.Net.Dns.GetHostName(); if (serverIp == hostName || serverIp == "localhost" || serverIp == System.Net.Dns.GetHostAddresses(hostName).GetValue(2).ToString()) { serverIp = "127.0.0.1"; } + * */ + DateTime timeStart = DateTime.Now; GSODataSource ds = globeControl1.Globe.DataManager.GetDataSourceByName(serverIp + "/" + textBoxDatabase.Text.Trim() + "_" + textBoxUser.Text.Trim()); if (ds == null) @@ -83,7 +86,7 @@ connectParams.dataSourceName = ds.Name; connectParams.databaseType = EnumDataSourceType.Oracle; Utility.connectParamsOfDatabase.Add(connectParams); - + setUtilityValue(connectParams); WriteXML(); MessageBox.Show("连接Oracle数据库成功,用时:" + secondsConnectOracle.ToString() + "秒", "提示"); } @@ -92,6 +95,14 @@ this.Close(); } + private void setUtilityValue(DatabaseConnectParams connectParams) + { + Utility.DBServer = connectParams.ip; + Utility.Database = connectParams.databaseName; + Utility.UserID = connectParams.userName; + Utility.DBPassword = connectParams.password; + } + private void ReadXML() { string strFileName = Path.GetDirectoryName(Application.ExecutablePath) + "/databaseConfigOracle.xml"; diff --git a/GXBuilder.cs b/GXBuilder.cs new file mode 100644 index 0000000..b2ec9b2 --- /dev/null +++ b/GXBuilder.cs @@ -0,0 +1,187 @@ +using System; +using System.Data; +using System.Drawing; +using System.Runtime.InteropServices; +using GeoScene.Data; +using GeoScene.Engine; +using GeoScene.Globe; + +namespace WorldGIS +{ + public class GXBuilder : ModelBuilder + { + private static double diameter = 0.1; + + public GXBuilder(GSODataSource ds) + : base(ds) + { + + } + + public override bool validate(GSOLayer layer) + { + return true; + } + + /// + /// + /// + /// 追加或修改 + /// 高程入库或埋深入库 + /// + public override bool doBuild(EnumUpdateMode updateMode, + EnumBuildMode buildMode, + BaseParam param) + { + LineParam lineParam = param as LineParam; + GSOFeatureDataset newFeatureSet = ds.GetDatasetByName(lineParam.layerName) as GSOFeatureDataset; + if (newFeatureSet == null) + { + newFeatureSet = CreateDBFeatureDataset(layer, lineParam.layerName); + } + newFeatureSet.Open(); + GSOFeatures features = layer.GetAllFeatures(true); + for (int i = 0; i < features.Length; i++) + { + GSOFeature f = features[i]; + GSOGeoPolyline3D lineeee = f.Geometry as GSOGeoPolyline3D; + if (lineeee == null || lineeee.GetSpaceLength(true, 6378137) == 0) + { + LogHelper.Error("出现数据无法入库:" + f.ID); + continue; + } + + GSOFeature newFeature = newFeatureSet.CreateFeature(); + + double radius = diameter; //创建光纤的半径 + newFeature.Geometry = updateGemotry(f, lineParam, radius, buildMode); + newFeature.Geometry.Style = getPipeLineStyle(lineParam, f, radius); + newFeature.Name = f.GetFieldAsString(lineParam.uniqueIdFieldName); + setFeatureValueByShapeFeature(f, newFeature); + // newFeatureSet + if (newFeatureSet.GetFeatureByName(newFeature.Name, true).Length > 0) + { + if (!this.UpdateGXDevice(newFeatureSet.GetFeatureByName(newFeature.Name, true)[0], + newFeature)) + { + LogHelper.Error("光纤设备更新失败:" + newFeature.Name+"\r\n"); + } + continue; + } + newFeatureSet.AddFeature(newFeature); + if (!AddGXDevice(newFeature)) + { + LogHelper.Error("光纤数据保存Alarm_Device失败:" + newFeature.Name+"\r\n"); + } + } + newFeatureSet.Save(); + newFeatureSet.Close(); + return true; + } + + private bool AddGXDevice(GSOFeature feature) + { + //保存数据到设备表 + try + { + String deviceType = feature.GetValue("DEVICETYPE") == null + ? "" : feature.GetValue("DEVICETYPE").ToString(); + String devCode = feature.GetValue("DEVICEID") == null + ? "" : feature.GetValue("DEVICEID").ToString(); + String road = feature.GetValue("ROAD") == null + ? "" : feature.GetValue("ROAD").ToString(); + + //TODO LIST: + string sqlCount = "select dbid from alarm_device_type where" + + " typename = '" + deviceType + "'"; + object dbid = OracleUtils.ExecuteScalar(OracleUtils.ConnectionString, + CommandType.Text, sqlCount); + if (dbid == null) + { + return false; + } + int deviceTypeId = int.Parse(dbid.ToString()); + string sql = "Insert into alarm_device (DBID,ACTIVE,DEVCODE,DEVNAME,FACTORY," + + "INSTALLDATE,GAOCHENG,HEIGHT,LATITUDE,LONGTITUDE,DEVICETYPE_ID) " + + "values (SEQ_DEVICE_ID.NEXTVAL, 1, '" + devCode + "', '" + deviceType + devCode + + "', " + "'航天二院', " + "to_date('" + DateTime.Now.ToString() + "','yyyy/MM/dd hh24:mi::ss'), " + + "0, 0, 0, 0, " + deviceTypeId + ")"; + OracleUtils.ExecuteNonQuery(OracleUtils.ConnectionString, CommandType.Text, sql); + + } + catch (Exception e) + { + throw; + } + return true; + } + + private bool UpdateGXDevice(GSOFeature feature, GSOFeature newFeature) + { + String deviceType = newFeature.GetValue("DEVICETYPE") == null + ? "" : newFeature.GetValue("DEVICETYPE").ToString(); + String devCode = newFeature.GetValue("DEVICEID") == null + ? "" : newFeature.GetValue("DEVICEID").ToString(); + String road = newFeature.GetValue("ROAD") == null + ? "" : newFeature.GetValue("ROAD").ToString(); + + feature.Geometry = newFeature.Geometry.Clone(); + this.setFeatureValueByShapeFeature(newFeature,feature); + // feature.Dataset.Save(); + + string sqlCount = "select dbid from alarm_device_type where" + + " typename = '" + deviceType + "'"; + object dbid = OracleUtils.ExecuteScalar(OracleUtils.ConnectionString, + CommandType.Text, sqlCount); + if (dbid == null) + { + return false; + } + int deviceTypeId = int.Parse(dbid.ToString()); + + string sql = "update alarm_device set FACTORY='" + road + + "', DEVICETYPE_ID='" + deviceTypeId + + "', DEVNAME='"+deviceType+devCode+"' "+ + "where devcode='" + devCode + "'"; + OracleUtils.ExecuteNonQuery(OracleUtils.ConnectionString, CommandType.Text, sql); + return true; + } + + private GSOLineStyle3D getPipeLineStyle(LineParam lineParam, GSOFeature f, double radius) + { + GSOPipeLineStyle3D style0 = new GSOPipeLineStyle3D(); + style0.LineColor = Color.FromArgb(lineParam.transparency, lineParam.lineColor); + style0.Slice = lineParam.sliceNum; + style0.CornerSliceAngle = lineParam.cornerSliceAngle; + style0.Radius = radius; + return style0; + } + + private GSOGeometry updateGemotry(GSOFeature f, LineParam lineParam, double radius, EnumBuildMode buildMode) + { + + f.Geometry.AltitudeMode = (buildMode.Equals(EnumBuildMode.Alititude)) ? EnumAltitudeMode.RelativeToGround : EnumAltitudeMode.Absolute; + + GSOGeoPolyline3D line = f.Geometry as GSOGeoPolyline3D; + if (line == null) + { + return null; //log4net 记录错误处理 + } + + double deep1 = 0; + double deep2 = 0; + + GSOPoint3ds pt3ds = new GSOPoint3ds(); + for (int n = 0; n < line[0].Count; n++) + { + GSOPoint3d pt3d = line[0][n]; + pt3d.Z = 0; + + pt3ds.Add(pt3d); + } + line[0] = pt3ds; + return line; + } + + } +} diff --git a/HTForms/FrmPipelineModelDataBase.cs b/HTForms/FrmPipelineModelDataBase.cs index 84a2d7b..3076bdd 100644 --- a/HTForms/FrmPipelineModelDataBase.cs +++ b/HTForms/FrmPipelineModelDataBase.cs @@ -91,6 +91,7 @@ } else datasource = ds; + if (comboBoxExLayer.Text.Trim() == "") { MessageBox.Show("请选择一个图层文件!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning); @@ -126,20 +127,12 @@ comboBoxExLayer.Text)); if (layer == null) return; - FieldValidate fieldValidate = FieldValidateFactory.Create(ValidateConfig.LoadConfig(), - getEnumValidateType()); - - if (!fieldValidate.Validate(layer)) + if (txtModelLayer.Text != "传感设备图层") { - DateTime dt=DateTime.Now; - string logFilePath = Application.StartupPath + "\\log\\" + dt.Year + "\\" + dt.Year + dt.Month + "\\" + dt.Year + - dt.Month + dt.Day + ".txt"; - MessageBox.Show("选择的数据不符合数据规范,详情见日志" + logFilePath, "提示"); - return; + if (!getValidateResult(layer)) + return; } - ModelBuilder lineBuilder = new LineBuilder(datasource); - LineParam lineParam = new LineParam(); lineParam.layerName = txtModelLayer.Text; lineParam.uniqueIdFieldName = cmbID.Text; @@ -149,14 +142,17 @@ lineParam.diameterFieldName = cmbRadius.Text; lineParam.relativeMode = (cmbReference.Text == "管顶") ? 0 : 1; lineParam.lineColor = btnPipelineColor.BackColor; - lineParam.transparency=Convert.ToByte(ComboboxRansparency.Value); + lineParam.transparency = Convert.ToByte(ComboboxRansparency.Value); lineParam.cornerSliceAngle = Convert.ToDouble(textBoxCornerSliceAngle.Text); - lineParam.sliceNum=Convert.ToInt32(txtSlice.Text); + lineParam.sliceNum = Convert.ToInt32(txtSlice.Text); lineParam.channelWidth = comboBoxExWidth.Text; lineParam.channelHeight = comboBoxExHeight.Text; - lineBuilder.build(layer, checkBoxAdd.Checked ? EnumUpdateMode.Append : EnumUpdateMode.Update, - checkBoxDeep.Checked ? EnumBuildMode.Depth : EnumBuildMode.Alititude, lineParam); + if (txtModelLayer.Text != "传感设备图层") + lineBuilder(layer, lineParam); + else + gxLineBuilder(layer, lineParam); + addLayerToGlobeControl(lineParam.layerName); //this.DialogResult = DialogResult.OK; MessageBox.Show("入库完成!", "提示"); @@ -167,6 +163,33 @@ } } + bool getValidateResult(GSOLayer layer) + { + FieldValidate fieldValidate = FieldValidateFactory.Create(ValidateConfig.LoadConfig(), + getEnumValidateType()); + + if (fieldValidate.Validate(layer)) return true; + DateTime dt = DateTime.Now; + string logFilePath = Application.StartupPath + "\\log\\" + dt.Year + "\\" + dt.Year + dt.Month + + "\\" + dt.Year + dt.Month + dt.Day + ".txt"; + MessageBox.Show("选择的数据不符合数据规范,详情见日志" + logFilePath, "提示"); + return false; + } + + void lineBuilder(GSOLayer layer,LineParam lineParam) + { + ModelBuilder lineBuilder = new LineBuilder(datasource); + lineBuilder.build(layer, checkBoxAdd.Checked ? EnumUpdateMode.Append : EnumUpdateMode.Update, + checkBoxDeep.Checked ? EnumBuildMode.Depth : EnumBuildMode.Alititude, lineParam); + } + + void gxLineBuilder(GSOLayer layer, LineParam lineParam) + { + ModelBuilder lineBuilder = new GXBuilder(datasource); + lineBuilder.build(layer, checkBoxAdd.Checked ? EnumUpdateMode.Append : EnumUpdateMode.Update, + checkBoxDeep.Checked ? EnumBuildMode.Depth : EnumBuildMode.Alititude, lineParam); + } + private EnumValidateType getEnumValidateType() { if (comboBoxExWidth.Text != "") diff --git a/LSPipeline.csproj b/LSPipeline.csproj index 477d8ba..599b492 100644 --- a/LSPipeline.csproj +++ b/LSPipeline.csproj @@ -222,6 +222,7 @@ FrmUpdateLayerFieldValues.cs + Form @@ -243,6 +244,7 @@ + True diff --git a/LSPipeline.suo b/LSPipeline.suo index c930f27..92b5d7d 100644 --- a/LSPipeline.suo +++ b/LSPipeline.suo Binary files differ diff --git a/OracleUtils.cs b/OracleUtils.cs new file mode 100644 index 0000000..c79d316 --- /dev/null +++ b/OracleUtils.cs @@ -0,0 +1,1271 @@ +using System; +using System.Collections; +using System.Data; +using System.Data.OracleClient; + +namespace WorldGIS +{ + public abstract class OracleUtils + { + // Read the connection strings from the configuration file + //public static readonly string ConnectionString = System.Configuration.ConfigurationSettings.AppSettings["ConnectionString"]; + public static readonly string ConnectionString = @"Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=" + Utility.DBServer + + ")(PORT=1521))(CONNECT_DATA=(SID=" + Utility.Database + + ")));Persist Security Info=True;User Id=" + Utility.UserID + + "; Password=" + Utility.DBPassword + ""; + + //Create a hashtable for the parameter cached + private static Hashtable parmCache = Hashtable.Synchronized(new Hashtable()); + + #region private utility methods & constructors + + //Since this class provides only static methods, make the default constructor private to prevent + //instances from being created with "new SqlHelper()". + private OracleUtils() { } + + /// + /// This method is used to attach array of SqlParameters to a SqlCommand. + /// + /// This method will assign a value of DbNull to any parameter with a direction of + /// InputOutput and a value of null. + /// + /// This behavior will prevent default values from being used, but + /// this will be the less common case than an intended pure output parameter (derived as InputOutput) + /// where the user provided no input value. + /// + /// The command to which the parameters will be added + /// an array of SqlParameters tho be added to command + private static void AttachParameters(OracleCommand command, OracleParameter[] commandParameters) + { + foreach (OracleParameter p in commandParameters) + { + //check for derived output value with no value assigned + if ((p.Direction == ParameterDirection.InputOutput) && (p.Value == null)) + { + p.Value = DBNull.Value; + } + + command.Parameters.Add(p); + } + } + + /// + /// This method assigns an array of values to an array of SqlParameters. + /// + /// array of SqlParameters to be assigned values + /// array of objects holding the values to be assigned + private static void AssignParameterValues(OracleParameter[] commandParameters, object[] parameterValues) + { + if ((commandParameters == null) || (parameterValues == null)) + { + //do nothing if we get no data + return; + } + + // we must have the same number of values as we pave parameters to put them in + if (commandParameters.Length != parameterValues.Length) + { + throw new ArgumentException("Parameter count does not match Parameter Value count."); + } + + //iterate through the SqlParameters, assigning the values from the corresponding position in the + //value array + for (int i = 0, j = commandParameters.Length; i < j; i++) + { + commandParameters[i].Value = parameterValues[i]; + } + } + + /// + /// This method opens (if necessary) and assigns a connection, transaction, command type and parameters + /// to the provided command. + /// + /// the SqlCommand to be prepared + /// a valid OracleConnection, on which to execute this command + /// a valid OracleTransaction, or 'null' + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an array of SqlParameters to be associated with the command or 'null' if no parameters are required + private static void PrepareCommand(OracleCommand command, OracleConnection connection, OracleTransaction transaction, CommandType commandType, string commandText, OracleParameter[] commandParameters) + { + //if the provided connection is not open, we will open it + if (connection.State != ConnectionState.Open) + { + connection.Open(); + } + + //associate the connection with the command + command.Connection = connection; + + //set the command text (stored procedure name or SQL statement) + command.CommandText = commandText; + + //if we were provided a transaction, assign it. + if (transaction != null) + { + command.Transaction = transaction; + } + + //set the command type + command.CommandType = commandType; + + //attach the command parameters if they are provided + if (commandParameters != null) + { + AttachParameters(command, commandParameters); + } + } + + + #endregion private utility methods & constructors + + #region ExecuteNonQuery + + /// + /// Execute a SqlCommand (that returns no resultset and takes no parameters) against the database specified in + /// the connection string. + /// + /// + /// e.g.: + /// int result = ExecuteNonQuery(connString, CommandType.StoredProcedure, "PublishOrders"); + /// + /// a valid connection string for a OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an int representing the number of rows affected by the command + public static int ExecuteNonQuery(string connectionString, CommandType commandType, string commandText) + { + //pass through the call providing null for the set of SqlParameters + return ExecuteNonQuery(connectionString, commandType, commandText, null); + } + + /// + /// Execute a SqlCommand (that returns no resultset) against the database specified in the connection string + /// using the provided parameters. + /// + /// + /// e.g.: + /// int result = ExecuteNonQuery(connString, CommandType.StoredProcedure, "PublishOrders", new OracleParameter("@prodid", 24)); + /// + /// a valid connection string for a OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an array of SqlParamters used to execute the command + /// an int representing the number of rows affected by the command + public static int ExecuteNonQuery(string connectionString, CommandType commandType, string commandText, params OracleParameter[] commandParameters) + { + //create & open a OracleConnection, and dispose of it after we are done. + using (OracleConnection cn = new OracleConnection(connectionString)) + { + cn.Open(); + + //call the overload that takes a connection in place of the connection string + return ExecuteNonQuery(cn, commandType, commandText, commandParameters); + } + } + + /// + /// Execute a stored procedure via a SqlCommand (that returns no resultset) against the database specified in + /// the connection string using the provided parameter values. This method will query the database to discover the parameters for the + /// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. + /// + /// + /// This method provides no access to output parameters or the stored procedure's return value parameter. + /// + /// e.g.: + /// int result = ExecuteNonQuery(connString, "PublishOrders", 24, 36); + /// + /// a valid connection string for a OracleConnection + /// the name of the stored prcedure + /// an array of objects to be assigned as the input values of the stored procedure + /// an int representing the number of rows affected by the command + public static int ExecuteNonQuery(string connectionString, string spName, params object[] parameterValues) + { + //if we receive parameter values, we need to figure out where they go + if ((parameterValues != null) && (parameterValues.Length > 0)) + { + //pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache) + OracleParameter[] commandParameters = OracleHelperParameterCache.GetSpParameterSet(connectionString, spName); + + //assign the provided values to these parameters based on parameter order + AssignParameterValues(commandParameters, parameterValues); + + //call the overload that takes an array of SqlParameters + return ExecuteNonQuery(connectionString, CommandType.StoredProcedure, spName, commandParameters); + } + //otherwise we can just call the SP without params + return ExecuteNonQuery(connectionString, CommandType.StoredProcedure, spName); + } + + /// + /// Execute a SqlCommand (that returns no resultset and takes no parameters) against the provided OracleConnection. + /// + /// + /// e.g.: + /// int result = ExecuteNonQuery(conn, CommandType.StoredProcedure, "PublishOrders"); + /// + /// a valid OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an int representing the number of rows affected by the command + public static int ExecuteNonQuery(OracleConnection connection, CommandType commandType, string commandText) + { + //pass through the call providing null for the set of SqlParameters + return ExecuteNonQuery(connection, commandType, commandText, null); + } + + /// + /// Execute a SqlCommand (that returns no resultset) against the specified OracleConnection + /// using the provided parameters. + /// + /// + /// e.g.: + /// int result = ExecuteNonQuery(conn, CommandType.StoredProcedure, "PublishOrders", new OracleParameter("@prodid", 24)); + /// + /// a valid OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an array of SqlParamters used to execute the command + /// an int representing the number of rows affected by the command + public static int ExecuteNonQuery(OracleConnection connection, CommandType commandType, string commandText, params OracleParameter[] commandParameters) + { + //create a command and prepare it for execution + + OracleCommand cmd = new OracleCommand(); + PrepareCommand(cmd, connection, null, commandType, commandText, commandParameters); + + //finally, execute the command. + int retval = cmd.ExecuteNonQuery(); + + // detach the SqlParameters from the command object, so they can be used again. + cmd.Parameters.Clear(); + return retval; + } + + public static int ExecuteNonQueryWithTimeout(string connectionString, CommandType commandType, string commandText, int cmdTimeout) + { + //create a command and prepare it for execution + using (OracleConnection cn = new OracleConnection(connectionString)) + { + cn.Open(); + OracleCommand cmd = new OracleCommand(); + PrepareCommand(cmd, cn, null, commandType, commandText, null); + cmd.CommandTimeout = cmdTimeout; + //finally, execute the command. + int retval = cmd.ExecuteNonQuery(); + + // detach the SqlParameters from the command object, so they can be used again. + cmd.Parameters.Clear(); + return retval; + } + + } + /// + /// Execute a stored procedure via a SqlCommand (that returns no resultset) against the specified OracleConnection + /// using the provided parameter values. This method will query the database to discover the parameters for the + /// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. + /// + /// + /// This method provides no access to output parameters or the stored procedure's return value parameter. + /// + /// e.g.: + /// int result = ExecuteNonQuery(conn, "PublishOrders", 24, 36); + /// + /// a valid OracleConnection + /// the name of the stored procedure + /// an array of objects to be assigned as the input values of the stored procedure + /// an int representing the number of rows affected by the command + public static int ExecuteNonQuery(OracleConnection connection, string spName, params object[] parameterValues) + { + //if we receive parameter values, we need to figure out where they go + if ((parameterValues != null) && (parameterValues.Length > 0)) + { + //pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache) + OracleParameter[] commandParameters = OracleHelperParameterCache.GetSpParameterSet(connection.ConnectionString, spName); + + //assign the provided values to these parameters based on parameter order + AssignParameterValues(commandParameters, parameterValues); + + //call the overload that takes an array of SqlParameters + return ExecuteNonQuery(connection, CommandType.StoredProcedure, spName, commandParameters); + } + //otherwise we can just call the SP without params + return ExecuteNonQuery(connection, CommandType.StoredProcedure, spName); + } + + /// + /// Execute a SqlCommand (that returns no resultset and takes no parameters) against the provided OracleTransaction. + /// + /// + /// e.g.: + /// int result = ExecuteNonQuery(trans, CommandType.StoredProcedure, "PublishOrders"); + /// + /// a valid OracleTransaction + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an int representing the number of rows affected by the command + public static int ExecuteNonQuery(OracleTransaction transaction, CommandType commandType, string commandText) + { + //pass through the call providing null for the set of SqlParameters + return ExecuteNonQuery(transaction, commandType, commandText, null); + } + + /// + /// Execute a SqlCommand (that returns no resultset) against the specified OracleTransaction + /// using the provided parameters. + /// + /// + /// e.g.: + /// int result = ExecuteNonQuery(trans, CommandType.StoredProcedure, "GetOrders", new OracleParameter("@prodid", 24)); + /// + /// a valid OracleTransaction + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an array of SqlParamters used to execute the command + /// an int representing the number of rows affected by the command + public static int ExecuteNonQuery(OracleTransaction transaction, CommandType commandType, string commandText, params OracleParameter[] commandParameters) + { + //create a command and prepare it for execution + OracleCommand cmd = new OracleCommand(); + PrepareCommand(cmd, transaction.Connection, transaction, commandType, commandText, commandParameters); + + //finally, execute the command. + int retval = cmd.ExecuteNonQuery(); + + // detach the SqlParameters from the command object, so they can be used again. + cmd.Parameters.Clear(); + return retval; + } + + /// + /// Execute a stored procedure via a SqlCommand (that returns no resultset) against the specified + /// OracleTransaction using the provided parameter values. This method will query the database to discover the parameters for the + /// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. + /// + /// + /// This method provides no access to output parameters or the stored procedure's return value parameter. + /// + /// e.g.: + /// int result = ExecuteNonQuery(conn, trans, "PublishOrders", 24, 36); + /// + /// a valid OracleTransaction + /// the name of the stored procedure + /// an array of objects to be assigned as the input values of the stored procedure + /// an int representing the number of rows affected by the command + public static int ExecuteNonQuery(OracleTransaction transaction, string spName, params object[] parameterValues) + { + //if we receive parameter values, we need to figure out where they go + if ((parameterValues != null) && (parameterValues.Length > 0)) + { + //pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache) + OracleParameter[] commandParameters = OracleHelperParameterCache.GetSpParameterSet(transaction.Connection.ConnectionString, spName); + + //assign the provided values to these parameters based on parameter order + AssignParameterValues(commandParameters, parameterValues); + + //call the overload that takes an array of SqlParameters + return ExecuteNonQuery(transaction, CommandType.StoredProcedure, spName, commandParameters); + } + //otherwise we can just call the SP without params + return ExecuteNonQuery(transaction, CommandType.StoredProcedure, spName); + } + + + #endregion ExecuteNonQuery + + #region ExecuteDataSet + + /// + /// Execute a SqlCommand (that returns a resultset and takes no parameters) against the database specified in + /// the connection string. + /// + /// + /// e.g.: + /// DataSet ds = ExecuteDataset(connString, CommandType.StoredProcedure, "GetOrders"); + /// + /// a valid connection string for a OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// a dataset containing the resultset generated by the command + public static DataSet ExecuteDataset(string connectionString, CommandType commandType, string commandText) + { + //pass through the call providing null for the set of SqlParameters + return ExecuteDataset(connectionString, commandType, commandText, null); + } + + /// + /// Execute a SqlCommand (that returns a resultset) against the database specified in the connection string + /// using the provided parameters. + /// + /// + /// e.g.: + /// DataSet ds = ExecuteDataset(connString, CommandType.StoredProcedure, "GetOrders", new OracleParameter("@prodid", 24)); + /// + /// a valid connection string for a OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an array of SqlParamters used to execute the command + /// a dataset containing the resultset generated by the command + public static DataSet ExecuteDataset(string connectionString, CommandType commandType, string commandText, params OracleParameter[] commandParameters) + { + //create & open a OracleConnection, and dispose of it after we are done. + using (OracleConnection cn = new OracleConnection(connectionString)) + { + cn.Open(); + + //call the overload that takes a connection in place of the connection string + return ExecuteDataset(cn, commandType, commandText, commandParameters); + } + } + + /// + /// Execute a stored procedure via a SqlCommand (that returns a resultset) against the database specified in + /// the connection string using the provided parameter values. This method will query the database to discover the parameters for the + /// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. + /// + /// + /// This method provides no access to output parameters or the stored procedure's return value parameter. + /// + /// e.g.: + /// DataSet ds = ExecuteDataset(connString, "GetOrders", 24, 36); + /// + /// a valid connection string for a OracleConnection + /// the name of the stored procedure + /// an array of objects to be assigned as the input values of the stored procedure + /// a dataset containing the resultset generated by the command + public static DataSet ExecuteDataset(string connectionString, string spName, params object[] parameterValues) + { + //if we receive parameter values, we need to figure out where they go + if ((parameterValues != null) && (parameterValues.Length > 0)) + { + //pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache) + OracleParameter[] commandParameters = OracleHelperParameterCache.GetSpParameterSet(connectionString, spName); + + //assign the provided values to these parameters based on parameter order + AssignParameterValues(commandParameters, parameterValues); + + //call the overload that takes an array of SqlParameters + return ExecuteDataset(connectionString, CommandType.StoredProcedure, spName, commandParameters); + } + //otherwise we can just call the SP without params + return ExecuteDataset(connectionString, CommandType.StoredProcedure, spName); + } + + /// + /// Execute a SqlCommand (that returns a resultset and takes no parameters) against the provided OracleConnection. + /// + /// + /// e.g.: + /// DataSet ds = ExecuteDataset(conn, CommandType.StoredProcedure, "GetOrders"); + /// + /// a valid OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// a dataset containing the resultset generated by the command + public static DataSet ExecuteDataset(OracleConnection connection, CommandType commandType, string commandText) + { + //pass through the call providing null for the set of SqlParameters + return ExecuteDataset(connection, commandType, commandText, null); + } + + /// + /// Execute a SqlCommand (that returns a resultset) against the specified OracleConnection + /// using the provided parameters. + /// + /// + /// e.g.: + /// DataSet ds = ExecuteDataset(conn, CommandType.StoredProcedure, "GetOrders", new OracleParameter("@prodid", 24)); + /// + /// a valid OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an array of SqlParamters used to execute the command + /// a dataset containing the resultset generated by the command + public static DataSet ExecuteDataset(OracleConnection connection, CommandType commandType, string commandText, params OracleParameter[] commandParameters) + { + //create a command and prepare it for execution + OracleCommand cmd = new OracleCommand(); + PrepareCommand(cmd, connection, null, commandType, commandText, commandParameters); + + //create the DataAdapter & DataSet + OracleDataAdapter da = new OracleDataAdapter(cmd); + DataSet ds = new DataSet(); + + //fill the DataSet using default values for DataTable names, etc. + da.Fill(ds); + + // detach the SqlParameters from the command object, so they can be used again. + cmd.Parameters.Clear(); + + //return the dataset + return ds; + } + + /// + /// Execute a stored procedure via a SqlCommand (that returns a resultset) against the specified OracleConnection + /// using the provided parameter values. This method will query the database to discover the parameters for the + /// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. + /// + /// + /// This method provides no access to output parameters or the stored procedure's return value parameter. + /// + /// e.g.: + /// DataSet ds = ExecuteDataset(conn, "GetOrders", 24, 36); + /// + /// a valid OracleConnection + /// the name of the stored procedure + /// an array of objects to be assigned as the input values of the stored procedure + /// a dataset containing the resultset generated by the command + public static DataSet ExecuteDataset(OracleConnection connection, string spName, params object[] parameterValues) + { + //if we receive parameter values, we need to figure out where they go + if ((parameterValues != null) && (parameterValues.Length > 0)) + { + //pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache) + OracleParameter[] commandParameters = OracleHelperParameterCache.GetSpParameterSet(connection.ConnectionString, spName); + + //assign the provided values to these parameters based on parameter order + AssignParameterValues(commandParameters, parameterValues); + + //call the overload that takes an array of SqlParameters + return ExecuteDataset(connection, CommandType.StoredProcedure, spName, commandParameters); + } + //otherwise we can just call the SP without params + return ExecuteDataset(connection, CommandType.StoredProcedure, spName); + } + + /// + /// Execute a SqlCommand (that returns a resultset and takes no parameters) against the provided OracleTransaction. + /// + /// + /// e.g.: + /// DataSet ds = ExecuteDataset(trans, CommandType.StoredProcedure, "GetOrders"); + /// + /// a valid OracleTransaction + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// a dataset containing the resultset generated by the command + public static DataSet ExecuteDataset(OracleTransaction transaction, CommandType commandType, string commandText) + { + //pass through the call providing null for the set of SqlParameters + return ExecuteDataset(transaction, commandType, commandText, null); + } + + /// + /// Execute a SqlCommand (that returns a resultset) against the specified OracleTransaction + /// using the provided parameters. + /// + /// + /// e.g.: + /// DataSet ds = ExecuteDataset(trans, CommandType.StoredProcedure, "GetOrders", new OracleParameter("@prodid", 24)); + /// + /// a valid OracleTransaction + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an array of SqlParamters used to execute the command + /// a dataset containing the resultset generated by the command + public static DataSet ExecuteDataset(OracleTransaction transaction, CommandType commandType, string commandText, params OracleParameter[] commandParameters) + { + //create a command and prepare it for execution + OracleCommand cmd = new OracleCommand(); + PrepareCommand(cmd, transaction.Connection, transaction, commandType, commandText, commandParameters); + + //create the DataAdapter & DataSet + OracleDataAdapter da = new OracleDataAdapter(cmd); + DataSet ds = new DataSet(); + + //fill the DataSet using default values for DataTable names, etc. + da.Fill(ds); + + // detach the SqlParameters from the command object, so they can be used again. + cmd.Parameters.Clear(); + + //return the dataset + return ds; + } + + /// + /// Execute a stored procedure via a SqlCommand (that returns a resultset) against the specified + /// OracleTransaction using the provided parameter values. This method will query the database to discover the parameters for the + /// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. + /// + /// + /// This method provides no access to output parameters or the stored procedure's return value parameter. + /// + /// e.g.: + /// DataSet ds = ExecuteDataset(trans, "GetOrders", 24, 36); + /// + /// a valid OracleTransaction + /// the name of the stored procedure + /// an array of objects to be assigned as the input values of the stored procedure + /// a dataset containing the resultset generated by the command + public static DataSet ExecuteDataset(OracleTransaction transaction, string spName, params object[] parameterValues) + { + //if we receive parameter values, we need to figure out where they go + if ((parameterValues != null) && (parameterValues.Length > 0)) + { + //pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache) + OracleParameter[] commandParameters = OracleHelperParameterCache.GetSpParameterSet(transaction.Connection.ConnectionString, spName); + + //assign the provided values to these parameters based on parameter order + AssignParameterValues(commandParameters, parameterValues); + + //call the overload that takes an array of SqlParameters + return ExecuteDataset(transaction, CommandType.StoredProcedure, spName, commandParameters); + } + //otherwise we can just call the SP without params + return ExecuteDataset(transaction, CommandType.StoredProcedure, spName); + } + + #endregion ExecuteDataSet + + #region ExecuteReader + + /// + /// this enum is used to indicate whether the connection was provided by the caller, or created by SqlHelper, so that + /// we can set the appropriate CommandBehavior when calling ExecuteReader() + /// + private enum OracleConnectionOwnership + { + /// Connection is owned and managed by SqlHelper + Internal, + /// Connection is owned and managed by the caller + External + } + + /// + /// Create and prepare a SqlCommand, and call ExecuteReader with the appropriate CommandBehavior. + /// + /// + /// If we created and opened the connection, we want the connection to be closed when the DataReader is closed. + /// + /// If the caller provided the connection, we want to leave it to them to manage. + /// + /// a valid OracleConnection, on which to execute this command + /// a valid OracleTransaction, or 'null' + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an array of SqlParameters to be associated with the command or 'null' if no parameters are required + /// indicates whether the connection parameter was provided by the caller, or created by SqlHelper + /// SqlDataReader containing the results of the command + private static OracleDataReader ExecuteReader(OracleConnection connection, OracleTransaction transaction, CommandType commandType, string commandText, OracleParameter[] commandParameters, OracleConnectionOwnership connectionOwnership) + { + //create a command and prepare it for execution + OracleCommand cmd = new OracleCommand(); + PrepareCommand(cmd, connection, transaction, commandType, commandText, commandParameters); + + //create a reader + OracleDataReader dr; + + // call ExecuteReader with the appropriate CommandBehavior + if (connectionOwnership == OracleConnectionOwnership.External) + { + dr = cmd.ExecuteReader(); + } + else + { + dr = cmd.ExecuteReader(CommandBehavior.CloseConnection); + + } + + // detach the SqlParameters from the command object, so they can be used again. + cmd.Parameters.Clear(); + + return dr; + } + + /// + /// Execute a SqlCommand (that returns a resultset and takes no parameters) against the database specified in + /// the connection string. + /// + /// + /// e.g.: + /// SqlDataReader dr = ExecuteReader(connString, CommandType.StoredProcedure, "GetOrders"); + /// + /// a valid connection string for a OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// a SqlDataReader containing the resultset generated by the command + public static OracleDataReader ExecuteReader(string connectionString, CommandType commandType, string commandText) + { + //pass through the call providing null for the set of SqlParameters + return ExecuteReader(connectionString, commandType, commandText, null); + } + + /// + /// Execute a SqlCommand (that returns a resultset) against the database specified in the connection string + /// using the provided parameters. + /// + /// + /// e.g.: + /// SqlDataReader dr = ExecuteReader(connString, CommandType.StoredProcedure, "GetOrders", new OracleParameter("@prodid", 24)); + /// + /// a valid connection string for a OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an array of SqlParamters used to execute the command + /// a SqlDataReader containing the resultset generated by the command + public static OracleDataReader ExecuteReader(string connectionString, CommandType commandType, string commandText, params OracleParameter[] commandParameters) + { + //create & open a OracleConnection + OracleConnection cn = new OracleConnection(connectionString); + cn.Open(); + + try + { + //call the private overload that takes an internally owned connection in place of the connection string + return ExecuteReader(cn, null, commandType, commandText, commandParameters, OracleConnectionOwnership.Internal); + } + catch + { + //if we fail to return the SqlDatReader, we need to close the connection ourselves + cn.Close(); + throw; + } + } + + /// + /// Execute a stored procedure via a SqlCommand (that returns a resultset) against the database specified in + /// the connection string using the provided parameter values. This method will query the database to discover the parameters for the + /// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. + /// + /// + /// This method provides no access to output parameters or the stored procedure's return value parameter. + /// + /// e.g.: + /// SqlDataReader dr = ExecuteReader(connString, "GetOrders", 24, 36); + /// + /// a valid connection string for a OracleConnection + /// the name of the stored procedure + /// an array of objects to be assigned as the input values of the stored procedure + /// a SqlDataReader containing the resultset generated by the command + public static OracleDataReader ExecuteReader(string connectionString, string spName, params object[] parameterValues) + { + //if we receive parameter values, we need to figure out where they go + if ((parameterValues != null) && (parameterValues.Length > 0)) + { + //pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache) + OracleParameter[] commandParameters = OracleHelperParameterCache.GetSpParameterSet(connectionString, spName); + + //assign the provided values to these parameters based on parameter order + AssignParameterValues(commandParameters, parameterValues); + + //call the overload that takes an array of SqlParameters + return ExecuteReader(connectionString, CommandType.StoredProcedure, spName, commandParameters); + } + //otherwise we can just call the SP without params + return ExecuteReader(connectionString, CommandType.StoredProcedure, spName); + } + + /// + /// Execute a SqlCommand (that returns a resultset and takes no parameters) against the provided OracleConnection. + /// + /// + /// e.g.: + /// SqlDataReader dr = ExecuteReader(conn, CommandType.StoredProcedure, "GetOrders"); + /// + /// a valid OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// a SqlDataReader containing the resultset generated by the command + public static OracleDataReader ExecuteReader(OracleConnection connection, CommandType commandType, string commandText) + { + //pass through the call providing null for the set of SqlParameters + return ExecuteReader(connection, commandType, commandText, null); + } + + /// + /// Execute a SqlCommand (that returns a resultset) against the specified OracleConnection + /// using the provided parameters. + /// + /// + /// e.g.: + /// SqlDataReader dr = ExecuteReader(conn, CommandType.StoredProcedure, "GetOrders", new OracleParameter("@prodid", 24)); + /// + /// a valid OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an array of SqlParamters used to execute the command + /// a SqlDataReader containing the resultset generated by the command + public static OracleDataReader ExecuteReader(OracleConnection connection, CommandType commandType, string commandText, params OracleParameter[] commandParameters) + { + //pass through the call to the private overload using a null transaction value and an externally owned connection + return ExecuteReader(connection, null, commandType, commandText, commandParameters, OracleConnectionOwnership.External); + } + + /// + /// Execute a stored procedure via a SqlCommand (that returns a resultset) against the specified OracleConnection + /// using the provided parameter values. This method will query the database to discover the parameters for the + /// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. + /// + /// + /// This method provides no access to output parameters or the stored procedure's return value parameter. + /// + /// e.g.: + /// SqlDataReader dr = ExecuteReader(conn, "GetOrders", 24, 36); + /// + /// a valid OracleConnection + /// the name of the stored procedure + /// an array of objects to be assigned as the input values of the stored procedure + /// a SqlDataReader containing the resultset generated by the command + public static OracleDataReader ExecuteReader(OracleConnection connection, string spName, params object[] parameterValues) + { + //if we receive parameter values, we need to figure out where they go + if ((parameterValues != null) && (parameterValues.Length > 0)) + { + OracleParameter[] commandParameters = OracleHelperParameterCache.GetSpParameterSet(connection.ConnectionString, spName); + + AssignParameterValues(commandParameters, parameterValues); + + return ExecuteReader(connection, CommandType.StoredProcedure, spName, commandParameters); + } + //otherwise we can just call the SP without params + return ExecuteReader(connection, CommandType.StoredProcedure, spName); + } + + /// + /// Execute a SqlCommand (that returns a resultset and takes no parameters) against the provided OracleTransaction. + /// + /// + /// e.g.: + /// SqlDataReader dr = ExecuteReader(trans, CommandType.StoredProcedure, "GetOrders"); + /// + /// a valid OracleTransaction + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// a SqlDataReader containing the resultset generated by the command + public static OracleDataReader ExecuteReader(OracleTransaction transaction, CommandType commandType, string commandText) + { + //pass through the call providing null for the set of SqlParameters + return ExecuteReader(transaction, commandType, commandText, null); + } + + /// + /// Execute a SqlCommand (that returns a resultset) against the specified OracleTransaction + /// using the provided parameters. + /// + /// + /// e.g.: + /// SqlDataReader dr = ExecuteReader(trans, CommandType.StoredProcedure, "GetOrders", new OracleParameter("@prodid", 24)); + /// + /// a valid OracleTransaction + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an array of SqlParamters used to execute the command + /// a SqlDataReader containing the resultset generated by the command + public static OracleDataReader ExecuteReader(OracleTransaction transaction, CommandType commandType, string commandText, params OracleParameter[] commandParameters) + { + //pass through to private overload, indicating that the connection is owned by the caller + return ExecuteReader(transaction.Connection, transaction, commandType, commandText, commandParameters, OracleConnectionOwnership.External); + } + + /// + /// Execute a stored procedure via a SqlCommand (that returns a resultset) against the specified + /// OracleTransaction using the provided parameter values. This method will query the database to discover the parameters for the + /// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. + /// + /// + /// This method provides no access to output parameters or the stored procedure's return value parameter. + /// + /// e.g.: + /// SqlDataReader dr = ExecuteReader(trans, "GetOrders", 24, 36); + /// + /// a valid OracleTransaction + /// the name of the stored procedure + /// an array of objects to be assigned as the input values of the stored procedure + /// a SqlDataReader containing the resultset generated by the command + public static OracleDataReader ExecuteReader(OracleTransaction transaction, string spName, params object[] parameterValues) + { + //if we receive parameter values, we need to figure out where they go + if ((parameterValues != null) && (parameterValues.Length > 0)) + { + OracleParameter[] commandParameters = OracleHelperParameterCache.GetSpParameterSet(transaction.Connection.ConnectionString, spName); + + AssignParameterValues(commandParameters, parameterValues); + + return ExecuteReader(transaction, CommandType.StoredProcedure, spName, commandParameters); + } + //otherwise we can just call the SP without params + return ExecuteReader(transaction, CommandType.StoredProcedure, spName); + } + + #endregion ExecuteReader + + #region ExecuteScalar + + /// + /// Execute a OracleCommand (that returns a 1x1 resultset and takes no parameters) against the database specified in + /// the connection string. + /// + /// + /// e.g.: + /// int orderCount = (int)ExecuteScalar(connString, CommandType.StoredProcedure, "GetOrderCount"); + /// + /// a valid connection string for a OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an object containing the value in the 1x1 resultset generated by the command + public static object ExecuteScalar(string connectionString, CommandType commandType, string commandText) + { + //pass through the call providing null for the set of SqlParameters + return ExecuteScalar(connectionString, commandType, commandText, null); + } + + /// + /// Execute a OracleCommand (that returns a 1x1 resultset) against the database specified in the connection string + /// using the provided parameters. + /// + /// + /// e.g.: + /// int orderCount = (int)ExecuteScalar(connString, CommandType.StoredProcedure, "GetOrderCount", new OracleParameter("@prodid", 24)); + /// + /// a valid connection string for a OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an array of SqlParamters used to execute the command + /// an object containing the value in the 1x1 resultset generated by the command + public static object ExecuteScalar(string connectionString, CommandType commandType, string commandText, params OracleParameter[] commandParameters) + { + //create & open a OracleConnection, and dispose of it after we are done. + using (OracleConnection cn = new OracleConnection(connectionString)) + { + cn.Open(); + + //call the overload that takes a connection in place of the connection string + return ExecuteScalar(cn, commandType, commandText, commandParameters); + } + } + + /// + /// Execute a stored procedure via a OracleCommand (that returns a 1x1 resultset) against the database specified in + /// the connection string using the provided parameter values. This method will query the database to discover the parameters for the + /// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. + /// + /// + /// This method provides no access to output parameters or the stored procedure's return value parameter. + /// + /// e.g.: + /// int orderCount = (int)ExecuteScalar(connString, "GetOrderCount", 24, 36); + /// + /// a valid connection string for a OracleConnection + /// the name of the stored procedure + /// an array of objects to be assigned as the input values of the stored procedure + /// an object containing the value in the 1x1 resultset generated by the command + public static object ExecuteScalar(string connectionString, string spName, params object[] parameterValues) + { + //if we receive parameter values, we need to figure out where they go + if ((parameterValues != null) && (parameterValues.Length > 0)) + { + //pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache) + OracleParameter[] commandParameters = OracleHelperParameterCache.GetSpParameterSet(connectionString, spName); + + //assign the provided values to these parameters based on parameter order + AssignParameterValues(commandParameters, parameterValues); + + //call the overload that takes an array of SqlParameters + return ExecuteScalar(connectionString, CommandType.StoredProcedure, spName, commandParameters); + } + //otherwise we can just call the SP without params + return ExecuteScalar(connectionString, CommandType.StoredProcedure, spName); + } + + /// + /// Execute a OracleCommand (that returns a 1x1 resultset and takes no parameters) against the provided OracleConnection. + /// + /// + /// e.g.: + /// int orderCount = (int)ExecuteScalar(conn, CommandType.StoredProcedure, "GetOrderCount"); + /// + /// a valid OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an object containing the value in the 1x1 resultset generated by the command + public static object ExecuteScalar(OracleConnection connection, CommandType commandType, string commandText) + { + //pass through the call providing null for the set of SqlParameters + return ExecuteScalar(connection, commandType, commandText, null); + } + + /// + /// Execute a OracleCommand (that returns a 1x1 resultset) against the specified OracleConnection + /// using the provided parameters. + /// + /// + /// e.g.: + /// int orderCount = (int)ExecuteScalar(conn, CommandType.StoredProcedure, "GetOrderCount", new OracleParameter("@prodid", 24)); + /// + /// a valid OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an array of SqlParamters used to execute the command + /// an object containing the value in the 1x1 resultset generated by the command + public static object ExecuteScalar(OracleConnection connection, CommandType commandType, string commandText, params OracleParameter[] commandParameters) + { + //create a command and prepare it for execution + OracleCommand cmd = new OracleCommand(); + PrepareCommand(cmd, connection, null, commandType, commandText, commandParameters); + + //execute the command & return the results + object retval = cmd.ExecuteScalar(); + + // detach the SqlParameters from the command object, so they can be used again. + cmd.Parameters.Clear(); + return retval; + + } + + /// + /// Execute a stored procedure via a OracleCommand (that returns a 1x1 resultset) against the specified OracleConnection + /// using the provided parameter values. This method will query the database to discover the parameters for the + /// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. + /// + /// + /// This method provides no access to output parameters or the stored procedure's return value parameter. + /// + /// e.g.: + /// int orderCount = (int)ExecuteScalar(conn, "GetOrderCount", 24, 36); + /// + /// a valid OracleConnection + /// the name of the stored procedure + /// an array of objects to be assigned as the input values of the stored procedure + /// an object containing the value in the 1x1 resultset generated by the command + public static object ExecuteScalar(OracleConnection connection, string spName, params object[] parameterValues) + { + //if we receive parameter values, we need to figure out where they go + if ((parameterValues != null) && (parameterValues.Length > 0)) + { + //pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache) + OracleParameter[] commandParameters = OracleHelperParameterCache.GetSpParameterSet(connection.ConnectionString, spName); + + //assign the provided values to these parameters based on parameter order + AssignParameterValues(commandParameters, parameterValues); + + //call the overload that takes an array of SqlParameters + return ExecuteScalar(connection, CommandType.StoredProcedure, spName, commandParameters); + } + //otherwise we can just call the SP without params + return ExecuteScalar(connection, CommandType.StoredProcedure, spName); + } + + /// + /// Execute a OracleCommand (that returns a 1x1 resultset and takes no parameters) against the provided OracleTransaction. + /// + /// + /// e.g.: + /// int orderCount = (int)ExecuteScalar(trans, CommandType.StoredProcedure, "GetOrderCount"); + /// + /// a valid OracleTransaction + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an object containing the value in the 1x1 resultset generated by the command + public static object ExecuteScalar(OracleTransaction transaction, CommandType commandType, string commandText) + { + //pass through the call providing null for the set of SqlParameters + return ExecuteScalar(transaction, commandType, commandText, null); + } + + /// + /// Execute a OracleCommand (that returns a 1x1 resultset) against the specified OracleTransaction + /// using the provided parameters. + /// + /// + /// e.g.: + /// int orderCount = (int)ExecuteScalar(trans, CommandType.StoredProcedure, "GetOrderCount", new OracleParameter("@prodid", 24)); + /// + /// a valid OracleTransaction + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an array of SqlParamters used to execute the command + /// an object containing the value in the 1x1 resultset generated by the command + public static object ExecuteScalar(OracleTransaction transaction, CommandType commandType, string commandText, params OracleParameter[] commandParameters) + { + //create a command and prepare it for execution + OracleCommand cmd = new OracleCommand(); + PrepareCommand(cmd, transaction.Connection, transaction, commandType, commandText, commandParameters); + + //execute the command & return the results + object retval = cmd.ExecuteScalar(); + + // detach the SqlParameters from the command object, so they can be used again. + cmd.Parameters.Clear(); + return retval; + } + + /// + /// Execute a stored procedure via a OracleCommand (that returns a 1x1 resultset) against the specified + /// OracleTransaction using the provided parameter values. This method will query the database to discover the parameters for the + /// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. + /// + /// + /// This method provides no access to output parameters or the stored procedure's return value parameter. + /// + /// e.g.: + /// int orderCount = (int)ExecuteScalar(trans, "GetOrderCount", 24, 36); + /// + /// a valid OracleTransaction + /// the name of the stored procedure + /// an array of objects to be assigned as the input values of the stored procedure + /// an object containing the value in the 1x1 resultset generated by the command + public static object ExecuteScalar(OracleTransaction transaction, string spName, params object[] parameterValues) + { + //if we receive parameter values, we need to figure out where they go + if ((parameterValues != null) && (parameterValues.Length > 0)) + { + //pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache) + OracleParameter[] commandParameters = OracleHelperParameterCache.GetSpParameterSet(transaction.Connection.ConnectionString, spName); + + //assign the provided values to these parameters based on parameter order + AssignParameterValues(commandParameters, parameterValues); + + //call the overload that takes an array of SqlParameters + return ExecuteScalar(transaction, CommandType.StoredProcedure, spName, commandParameters); + } + //otherwise we can just call the SP without params + return ExecuteScalar(transaction, CommandType.StoredProcedure, spName); + } + + #endregion ExecuteScalar + + + } + /// + /// OracleHelperParameterCache provides functions to leverage a static cache of procedure parameters, and the + /// ability to discover parameters for stored procedures at run-time. + /// + /// + + public sealed class OracleHelperParameterCache + { + #region private methods, variables, and constructors + + //Since this class provides only static methods, make the default constructor private to prevent + //instances from being created with "new SqlHelperParameterCache()". + private OracleHelperParameterCache() { } + + private static Hashtable paramCache = Hashtable.Synchronized(new Hashtable()); + + /// + /// resolve at run time the appropriate set of SqlParameters for a stored procedure + /// + /// a valid connection string for a OracleConnection + /// the name of the stored procedure + /// whether or not to include their return value parameter + /// + private static OracleParameter[] DiscoverSpParameterSet(string connectionString, string spName, bool includeReturnValueParameter) + { + using (OracleConnection cn = new OracleConnection(connectionString)) + using (OracleCommand cmd = new OracleCommand(spName, cn)) + { + cn.Open(); + cmd.CommandType = CommandType.StoredProcedure; + OracleCommandBuilder.DeriveParameters(cmd); + + if (!includeReturnValueParameter) + { + cmd.Parameters.RemoveAt(0); + } + + OracleParameter[] discoveredParameters = new OracleParameter[cmd.Parameters.Count]; ; + + cmd.Parameters.CopyTo(discoveredParameters, 0); + + return discoveredParameters; + } + } + + //deep copy of cached OracleParameter array + private static OracleParameter[] CloneParameters(OracleParameter[] originalParameters) + { + OracleParameter[] clonedParameters = new OracleParameter[originalParameters.Length]; + + for (int i = 0, j = originalParameters.Length; i < j; i++) + { + clonedParameters[i] = (OracleParameter)((ICloneable)originalParameters[i]).Clone(); + } + + return clonedParameters; + } + + #endregion private methods, variables, and constructors + + #region caching functions + + /// + /// add parameter array to the cache + /// + /// a valid connection string for a OracleConnection + /// the stored procedure name or T-SQL command + /// an array of SqlParamters to be cached + public static void CacheParameterSet(string connectionString, string commandText, params OracleParameter[] commandParameters) + { + string hashKey = connectionString + ":" + commandText; + + paramCache[hashKey] = commandParameters; + } + + /// + /// retrieve a parameter array from the cache + /// + /// a valid connection string for a OracleConnection + /// the stored procedure name or T-SQL command + /// an array of SqlParamters + public static OracleParameter[] GetCachedParameterSet(string connectionString, string commandText) + { + string hashKey = connectionString + ":" + commandText; + + OracleParameter[] cachedParameters = (OracleParameter[])paramCache[hashKey]; + + if (cachedParameters == null) + { + return null; + } + return CloneParameters(cachedParameters); + } + + #endregion caching functions + + #region Parameter Discovery Functions + + /// + /// Retrieves the set of SqlParameters appropriate for the stored procedure + /// + /// + /// This method will query the database for this information, and then store it in a cache for future requests. + /// + /// a valid connection string for a OracleConnection + /// the name of the stored procedure + /// an array of SqlParameters + public static OracleParameter[] GetSpParameterSet(string connectionString, string spName) + { + return GetSpParameterSet(connectionString, spName, false); + } + + /// + /// Retrieves the set of SqlParameters appropriate for the stored procedure + /// + /// + /// This method will query the database for this information, and then store it in a cache for future requests. + /// + /// a valid connection string for a OracleConnection + /// the name of the stored procedure + /// a bool value indicating whether the return value parameter should be included in the results + /// an array of SqlParameters + public static OracleParameter[] GetSpParameterSet(string connectionString, string spName, bool includeReturnValueParameter) + { + string hashKey = connectionString + ":" + spName + (includeReturnValueParameter ? ":include ReturnValue Parameter" : ""); + + OracleParameter[] cachedParameters; + + cachedParameters = (OracleParameter[])paramCache[hashKey]; + + if (cachedParameters == null) + { + cachedParameters = (OracleParameter[])(paramCache[hashKey] = DiscoverSpParameterSet(connectionString, spName, includeReturnValueParameter)); + } + + return CloneParameters(cachedParameters); + } + + #endregion Parameter Discovery Functions + } +} diff --git a/Utility.cs b/Utility.cs index 1429fd9..4e64d66 100644 --- a/Utility.cs +++ b/Utility.cs @@ -17,6 +17,11 @@ { public class Utility { + public static string DBServer; + public static string Database; + public static string UserID; + public static string DBPassword; + public static void SetBallons(GSOBalloon featureTooltip,GSOBalloonEx balloonEx) { featureTooltip.CacheFilePath = Path.GetDirectoryName(Application.ExecutablePath) + "/GeoScene/Globe/Temp"; diff --git a/bin/x64/Debug/LSPipeline.exe b/bin/x64/Debug/LSPipeline.exe index 833a5e5..76f838b 100644 --- a/bin/x64/Debug/LSPipeline.exe +++ b/bin/x64/Debug/LSPipeline.exe Binary files differ diff --git a/bin/x64/Debug/LSPipeline.pdb b/bin/x64/Debug/LSPipeline.pdb index 245e727..28c81dc 100644 --- a/bin/x64/Debug/LSPipeline.pdb +++ b/bin/x64/Debug/LSPipeline.pdb Binary files differ diff --git a/bin/x64/Debug/databaseConfigOracle.xml b/bin/x64/Debug/databaseConfigOracle.xml index 7e48b08..94be70c 100644 --- a/bin/x64/Debug/databaseConfigOracle.xml +++ b/bin/x64/Debug/databaseConfigOracle.xml @@ -2,7 +2,7 @@ True 192.168.0.203 - szhtdb2 - release - release + eydb2 + scott + scott \ No newline at end of file diff --git a/bin/x64/Debug/log.txt b/bin/x64/Debug/log.txt index 5236cc6..73bcf38 100644 --- a/bin/x64/Debug/log.txt +++ b/bin/x64/Debug/log.txt @@ -27704,3 +27704,75 @@ exception over ------------------------------------------------------------ + + exception begin -----------------2016/12/2 9:55:40--------------------- + + + + e.Message:输入字符串的格式不正确。 + + e.Source:mscorlib + + e.TargetSite:Double ParseDouble(System.String, System.Globalization.NumberStyles, System.Globalization.NumberFormatInfo) + + e.StackTrace: 在 System.Number.ParseDouble(String value, NumberStyles options, NumberFormatInfo numfmt) + 在 System.Double.Parse(String s, IFormatProvider provider) + 在 WorldGIS.CtrlEntitySpaceInfo.positionChanged() 位置 D:\LSPipeline\UserControls\CtrlEntitySpaceInfo.cs:行号 113 + + + + exception over ------------------------------------------------------------ + + exception begin -----------------2016/12/2 9:55:41--------------------- + + + + e.Message:输入字符串的格式不正确。 + + e.Source:mscorlib + + e.TargetSite:Double ParseDouble(System.String, System.Globalization.NumberStyles, System.Globalization.NumberFormatInfo) + + e.StackTrace: 在 System.Number.ParseDouble(String value, NumberStyles options, NumberFormatInfo numfmt) + 在 System.Double.Parse(String s, IFormatProvider provider) + 在 WorldGIS.CtrlEntitySpaceInfo.positionChanged() 位置 D:\LSPipeline\UserControls\CtrlEntitySpaceInfo.cs:行号 115 + + + + exception over ------------------------------------------------------------ + + exception begin -----------------2016/12/2 9:55:55--------------------- + + + + e.Message:输入字符串的格式不正确。 + + e.Source:mscorlib + + e.TargetSite:Double ParseDouble(System.String, System.Globalization.NumberStyles, System.Globalization.NumberFormatInfo) + + e.StackTrace: 在 System.Number.ParseDouble(String value, NumberStyles options, NumberFormatInfo numfmt) + 在 System.Double.Parse(String s, IFormatProvider provider) + 在 WorldGIS.CtrlEntitySpaceInfo.positionChanged() 位置 D:\LSPipeline\UserControls\CtrlEntitySpaceInfo.cs:行号 113 + + + + exception over ------------------------------------------------------------ + + exception begin -----------------2016/12/2 9:55:56--------------------- + + + + e.Message:输入字符串的格式不正确。 + + e.Source:mscorlib + + e.TargetSite:Double ParseDouble(System.String, System.Globalization.NumberStyles, System.Globalization.NumberFormatInfo) + + e.StackTrace: 在 System.Number.ParseDouble(String value, NumberStyles options, NumberFormatInfo numfmt) + 在 System.Double.Parse(String s, IFormatProvider provider) + 在 WorldGIS.CtrlEntitySpaceInfo.positionChanged() 位置 D:\LSPipeline\UserControls\CtrlEntitySpaceInfo.cs:行号 115 + + + + exception over ------------------------------------------------------------ diff --git a/FrmDatabaseParaSettingOracle.cs b/FrmDatabaseParaSettingOracle.cs index 18c5e99..6e97dfb 100644 --- a/FrmDatabaseParaSettingOracle.cs +++ b/FrmDatabaseParaSettingOracle.cs @@ -47,12 +47,15 @@ } string serverIp = textBoxIP.Text.Trim(); + /* string hostName = System.Net.Dns.GetHostName(); if (serverIp == hostName || serverIp == "localhost" || serverIp == System.Net.Dns.GetHostAddresses(hostName).GetValue(2).ToString()) { serverIp = "127.0.0.1"; } + * */ + DateTime timeStart = DateTime.Now; GSODataSource ds = globeControl1.Globe.DataManager.GetDataSourceByName(serverIp + "/" + textBoxDatabase.Text.Trim() + "_" + textBoxUser.Text.Trim()); if (ds == null) @@ -83,7 +86,7 @@ connectParams.dataSourceName = ds.Name; connectParams.databaseType = EnumDataSourceType.Oracle; Utility.connectParamsOfDatabase.Add(connectParams); - + setUtilityValue(connectParams); WriteXML(); MessageBox.Show("连接Oracle数据库成功,用时:" + secondsConnectOracle.ToString() + "秒", "提示"); } @@ -92,6 +95,14 @@ this.Close(); } + private void setUtilityValue(DatabaseConnectParams connectParams) + { + Utility.DBServer = connectParams.ip; + Utility.Database = connectParams.databaseName; + Utility.UserID = connectParams.userName; + Utility.DBPassword = connectParams.password; + } + private void ReadXML() { string strFileName = Path.GetDirectoryName(Application.ExecutablePath) + "/databaseConfigOracle.xml"; diff --git a/GXBuilder.cs b/GXBuilder.cs new file mode 100644 index 0000000..b2ec9b2 --- /dev/null +++ b/GXBuilder.cs @@ -0,0 +1,187 @@ +using System; +using System.Data; +using System.Drawing; +using System.Runtime.InteropServices; +using GeoScene.Data; +using GeoScene.Engine; +using GeoScene.Globe; + +namespace WorldGIS +{ + public class GXBuilder : ModelBuilder + { + private static double diameter = 0.1; + + public GXBuilder(GSODataSource ds) + : base(ds) + { + + } + + public override bool validate(GSOLayer layer) + { + return true; + } + + /// + /// + /// + /// 追加或修改 + /// 高程入库或埋深入库 + /// + public override bool doBuild(EnumUpdateMode updateMode, + EnumBuildMode buildMode, + BaseParam param) + { + LineParam lineParam = param as LineParam; + GSOFeatureDataset newFeatureSet = ds.GetDatasetByName(lineParam.layerName) as GSOFeatureDataset; + if (newFeatureSet == null) + { + newFeatureSet = CreateDBFeatureDataset(layer, lineParam.layerName); + } + newFeatureSet.Open(); + GSOFeatures features = layer.GetAllFeatures(true); + for (int i = 0; i < features.Length; i++) + { + GSOFeature f = features[i]; + GSOGeoPolyline3D lineeee = f.Geometry as GSOGeoPolyline3D; + if (lineeee == null || lineeee.GetSpaceLength(true, 6378137) == 0) + { + LogHelper.Error("出现数据无法入库:" + f.ID); + continue; + } + + GSOFeature newFeature = newFeatureSet.CreateFeature(); + + double radius = diameter; //创建光纤的半径 + newFeature.Geometry = updateGemotry(f, lineParam, radius, buildMode); + newFeature.Geometry.Style = getPipeLineStyle(lineParam, f, radius); + newFeature.Name = f.GetFieldAsString(lineParam.uniqueIdFieldName); + setFeatureValueByShapeFeature(f, newFeature); + // newFeatureSet + if (newFeatureSet.GetFeatureByName(newFeature.Name, true).Length > 0) + { + if (!this.UpdateGXDevice(newFeatureSet.GetFeatureByName(newFeature.Name, true)[0], + newFeature)) + { + LogHelper.Error("光纤设备更新失败:" + newFeature.Name+"\r\n"); + } + continue; + } + newFeatureSet.AddFeature(newFeature); + if (!AddGXDevice(newFeature)) + { + LogHelper.Error("光纤数据保存Alarm_Device失败:" + newFeature.Name+"\r\n"); + } + } + newFeatureSet.Save(); + newFeatureSet.Close(); + return true; + } + + private bool AddGXDevice(GSOFeature feature) + { + //保存数据到设备表 + try + { + String deviceType = feature.GetValue("DEVICETYPE") == null + ? "" : feature.GetValue("DEVICETYPE").ToString(); + String devCode = feature.GetValue("DEVICEID") == null + ? "" : feature.GetValue("DEVICEID").ToString(); + String road = feature.GetValue("ROAD") == null + ? "" : feature.GetValue("ROAD").ToString(); + + //TODO LIST: + string sqlCount = "select dbid from alarm_device_type where" + + " typename = '" + deviceType + "'"; + object dbid = OracleUtils.ExecuteScalar(OracleUtils.ConnectionString, + CommandType.Text, sqlCount); + if (dbid == null) + { + return false; + } + int deviceTypeId = int.Parse(dbid.ToString()); + string sql = "Insert into alarm_device (DBID,ACTIVE,DEVCODE,DEVNAME,FACTORY," + + "INSTALLDATE,GAOCHENG,HEIGHT,LATITUDE,LONGTITUDE,DEVICETYPE_ID) " + + "values (SEQ_DEVICE_ID.NEXTVAL, 1, '" + devCode + "', '" + deviceType + devCode + + "', " + "'航天二院', " + "to_date('" + DateTime.Now.ToString() + "','yyyy/MM/dd hh24:mi::ss'), " + + "0, 0, 0, 0, " + deviceTypeId + ")"; + OracleUtils.ExecuteNonQuery(OracleUtils.ConnectionString, CommandType.Text, sql); + + } + catch (Exception e) + { + throw; + } + return true; + } + + private bool UpdateGXDevice(GSOFeature feature, GSOFeature newFeature) + { + String deviceType = newFeature.GetValue("DEVICETYPE") == null + ? "" : newFeature.GetValue("DEVICETYPE").ToString(); + String devCode = newFeature.GetValue("DEVICEID") == null + ? "" : newFeature.GetValue("DEVICEID").ToString(); + String road = newFeature.GetValue("ROAD") == null + ? "" : newFeature.GetValue("ROAD").ToString(); + + feature.Geometry = newFeature.Geometry.Clone(); + this.setFeatureValueByShapeFeature(newFeature,feature); + // feature.Dataset.Save(); + + string sqlCount = "select dbid from alarm_device_type where" + + " typename = '" + deviceType + "'"; + object dbid = OracleUtils.ExecuteScalar(OracleUtils.ConnectionString, + CommandType.Text, sqlCount); + if (dbid == null) + { + return false; + } + int deviceTypeId = int.Parse(dbid.ToString()); + + string sql = "update alarm_device set FACTORY='" + road + + "', DEVICETYPE_ID='" + deviceTypeId + + "', DEVNAME='"+deviceType+devCode+"' "+ + "where devcode='" + devCode + "'"; + OracleUtils.ExecuteNonQuery(OracleUtils.ConnectionString, CommandType.Text, sql); + return true; + } + + private GSOLineStyle3D getPipeLineStyle(LineParam lineParam, GSOFeature f, double radius) + { + GSOPipeLineStyle3D style0 = new GSOPipeLineStyle3D(); + style0.LineColor = Color.FromArgb(lineParam.transparency, lineParam.lineColor); + style0.Slice = lineParam.sliceNum; + style0.CornerSliceAngle = lineParam.cornerSliceAngle; + style0.Radius = radius; + return style0; + } + + private GSOGeometry updateGemotry(GSOFeature f, LineParam lineParam, double radius, EnumBuildMode buildMode) + { + + f.Geometry.AltitudeMode = (buildMode.Equals(EnumBuildMode.Alititude)) ? EnumAltitudeMode.RelativeToGround : EnumAltitudeMode.Absolute; + + GSOGeoPolyline3D line = f.Geometry as GSOGeoPolyline3D; + if (line == null) + { + return null; //log4net 记录错误处理 + } + + double deep1 = 0; + double deep2 = 0; + + GSOPoint3ds pt3ds = new GSOPoint3ds(); + for (int n = 0; n < line[0].Count; n++) + { + GSOPoint3d pt3d = line[0][n]; + pt3d.Z = 0; + + pt3ds.Add(pt3d); + } + line[0] = pt3ds; + return line; + } + + } +} diff --git a/HTForms/FrmPipelineModelDataBase.cs b/HTForms/FrmPipelineModelDataBase.cs index 84a2d7b..3076bdd 100644 --- a/HTForms/FrmPipelineModelDataBase.cs +++ b/HTForms/FrmPipelineModelDataBase.cs @@ -91,6 +91,7 @@ } else datasource = ds; + if (comboBoxExLayer.Text.Trim() == "") { MessageBox.Show("请选择一个图层文件!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning); @@ -126,20 +127,12 @@ comboBoxExLayer.Text)); if (layer == null) return; - FieldValidate fieldValidate = FieldValidateFactory.Create(ValidateConfig.LoadConfig(), - getEnumValidateType()); - - if (!fieldValidate.Validate(layer)) + if (txtModelLayer.Text != "传感设备图层") { - DateTime dt=DateTime.Now; - string logFilePath = Application.StartupPath + "\\log\\" + dt.Year + "\\" + dt.Year + dt.Month + "\\" + dt.Year + - dt.Month + dt.Day + ".txt"; - MessageBox.Show("选择的数据不符合数据规范,详情见日志" + logFilePath, "提示"); - return; + if (!getValidateResult(layer)) + return; } - ModelBuilder lineBuilder = new LineBuilder(datasource); - LineParam lineParam = new LineParam(); lineParam.layerName = txtModelLayer.Text; lineParam.uniqueIdFieldName = cmbID.Text; @@ -149,14 +142,17 @@ lineParam.diameterFieldName = cmbRadius.Text; lineParam.relativeMode = (cmbReference.Text == "管顶") ? 0 : 1; lineParam.lineColor = btnPipelineColor.BackColor; - lineParam.transparency=Convert.ToByte(ComboboxRansparency.Value); + lineParam.transparency = Convert.ToByte(ComboboxRansparency.Value); lineParam.cornerSliceAngle = Convert.ToDouble(textBoxCornerSliceAngle.Text); - lineParam.sliceNum=Convert.ToInt32(txtSlice.Text); + lineParam.sliceNum = Convert.ToInt32(txtSlice.Text); lineParam.channelWidth = comboBoxExWidth.Text; lineParam.channelHeight = comboBoxExHeight.Text; - lineBuilder.build(layer, checkBoxAdd.Checked ? EnumUpdateMode.Append : EnumUpdateMode.Update, - checkBoxDeep.Checked ? EnumBuildMode.Depth : EnumBuildMode.Alititude, lineParam); + if (txtModelLayer.Text != "传感设备图层") + lineBuilder(layer, lineParam); + else + gxLineBuilder(layer, lineParam); + addLayerToGlobeControl(lineParam.layerName); //this.DialogResult = DialogResult.OK; MessageBox.Show("入库完成!", "提示"); @@ -167,6 +163,33 @@ } } + bool getValidateResult(GSOLayer layer) + { + FieldValidate fieldValidate = FieldValidateFactory.Create(ValidateConfig.LoadConfig(), + getEnumValidateType()); + + if (fieldValidate.Validate(layer)) return true; + DateTime dt = DateTime.Now; + string logFilePath = Application.StartupPath + "\\log\\" + dt.Year + "\\" + dt.Year + dt.Month + + "\\" + dt.Year + dt.Month + dt.Day + ".txt"; + MessageBox.Show("选择的数据不符合数据规范,详情见日志" + logFilePath, "提示"); + return false; + } + + void lineBuilder(GSOLayer layer,LineParam lineParam) + { + ModelBuilder lineBuilder = new LineBuilder(datasource); + lineBuilder.build(layer, checkBoxAdd.Checked ? EnumUpdateMode.Append : EnumUpdateMode.Update, + checkBoxDeep.Checked ? EnumBuildMode.Depth : EnumBuildMode.Alititude, lineParam); + } + + void gxLineBuilder(GSOLayer layer, LineParam lineParam) + { + ModelBuilder lineBuilder = new GXBuilder(datasource); + lineBuilder.build(layer, checkBoxAdd.Checked ? EnumUpdateMode.Append : EnumUpdateMode.Update, + checkBoxDeep.Checked ? EnumBuildMode.Depth : EnumBuildMode.Alititude, lineParam); + } + private EnumValidateType getEnumValidateType() { if (comboBoxExWidth.Text != "") diff --git a/LSPipeline.csproj b/LSPipeline.csproj index 477d8ba..599b492 100644 --- a/LSPipeline.csproj +++ b/LSPipeline.csproj @@ -222,6 +222,7 @@ FrmUpdateLayerFieldValues.cs + Form @@ -243,6 +244,7 @@ + True diff --git a/LSPipeline.suo b/LSPipeline.suo index c930f27..92b5d7d 100644 --- a/LSPipeline.suo +++ b/LSPipeline.suo Binary files differ diff --git a/OracleUtils.cs b/OracleUtils.cs new file mode 100644 index 0000000..c79d316 --- /dev/null +++ b/OracleUtils.cs @@ -0,0 +1,1271 @@ +using System; +using System.Collections; +using System.Data; +using System.Data.OracleClient; + +namespace WorldGIS +{ + public abstract class OracleUtils + { + // Read the connection strings from the configuration file + //public static readonly string ConnectionString = System.Configuration.ConfigurationSettings.AppSettings["ConnectionString"]; + public static readonly string ConnectionString = @"Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=" + Utility.DBServer + + ")(PORT=1521))(CONNECT_DATA=(SID=" + Utility.Database + + ")));Persist Security Info=True;User Id=" + Utility.UserID + + "; Password=" + Utility.DBPassword + ""; + + //Create a hashtable for the parameter cached + private static Hashtable parmCache = Hashtable.Synchronized(new Hashtable()); + + #region private utility methods & constructors + + //Since this class provides only static methods, make the default constructor private to prevent + //instances from being created with "new SqlHelper()". + private OracleUtils() { } + + /// + /// This method is used to attach array of SqlParameters to a SqlCommand. + /// + /// This method will assign a value of DbNull to any parameter with a direction of + /// InputOutput and a value of null. + /// + /// This behavior will prevent default values from being used, but + /// this will be the less common case than an intended pure output parameter (derived as InputOutput) + /// where the user provided no input value. + /// + /// The command to which the parameters will be added + /// an array of SqlParameters tho be added to command + private static void AttachParameters(OracleCommand command, OracleParameter[] commandParameters) + { + foreach (OracleParameter p in commandParameters) + { + //check for derived output value with no value assigned + if ((p.Direction == ParameterDirection.InputOutput) && (p.Value == null)) + { + p.Value = DBNull.Value; + } + + command.Parameters.Add(p); + } + } + + /// + /// This method assigns an array of values to an array of SqlParameters. + /// + /// array of SqlParameters to be assigned values + /// array of objects holding the values to be assigned + private static void AssignParameterValues(OracleParameter[] commandParameters, object[] parameterValues) + { + if ((commandParameters == null) || (parameterValues == null)) + { + //do nothing if we get no data + return; + } + + // we must have the same number of values as we pave parameters to put them in + if (commandParameters.Length != parameterValues.Length) + { + throw new ArgumentException("Parameter count does not match Parameter Value count."); + } + + //iterate through the SqlParameters, assigning the values from the corresponding position in the + //value array + for (int i = 0, j = commandParameters.Length; i < j; i++) + { + commandParameters[i].Value = parameterValues[i]; + } + } + + /// + /// This method opens (if necessary) and assigns a connection, transaction, command type and parameters + /// to the provided command. + /// + /// the SqlCommand to be prepared + /// a valid OracleConnection, on which to execute this command + /// a valid OracleTransaction, or 'null' + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an array of SqlParameters to be associated with the command or 'null' if no parameters are required + private static void PrepareCommand(OracleCommand command, OracleConnection connection, OracleTransaction transaction, CommandType commandType, string commandText, OracleParameter[] commandParameters) + { + //if the provided connection is not open, we will open it + if (connection.State != ConnectionState.Open) + { + connection.Open(); + } + + //associate the connection with the command + command.Connection = connection; + + //set the command text (stored procedure name or SQL statement) + command.CommandText = commandText; + + //if we were provided a transaction, assign it. + if (transaction != null) + { + command.Transaction = transaction; + } + + //set the command type + command.CommandType = commandType; + + //attach the command parameters if they are provided + if (commandParameters != null) + { + AttachParameters(command, commandParameters); + } + } + + + #endregion private utility methods & constructors + + #region ExecuteNonQuery + + /// + /// Execute a SqlCommand (that returns no resultset and takes no parameters) against the database specified in + /// the connection string. + /// + /// + /// e.g.: + /// int result = ExecuteNonQuery(connString, CommandType.StoredProcedure, "PublishOrders"); + /// + /// a valid connection string for a OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an int representing the number of rows affected by the command + public static int ExecuteNonQuery(string connectionString, CommandType commandType, string commandText) + { + //pass through the call providing null for the set of SqlParameters + return ExecuteNonQuery(connectionString, commandType, commandText, null); + } + + /// + /// Execute a SqlCommand (that returns no resultset) against the database specified in the connection string + /// using the provided parameters. + /// + /// + /// e.g.: + /// int result = ExecuteNonQuery(connString, CommandType.StoredProcedure, "PublishOrders", new OracleParameter("@prodid", 24)); + /// + /// a valid connection string for a OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an array of SqlParamters used to execute the command + /// an int representing the number of rows affected by the command + public static int ExecuteNonQuery(string connectionString, CommandType commandType, string commandText, params OracleParameter[] commandParameters) + { + //create & open a OracleConnection, and dispose of it after we are done. + using (OracleConnection cn = new OracleConnection(connectionString)) + { + cn.Open(); + + //call the overload that takes a connection in place of the connection string + return ExecuteNonQuery(cn, commandType, commandText, commandParameters); + } + } + + /// + /// Execute a stored procedure via a SqlCommand (that returns no resultset) against the database specified in + /// the connection string using the provided parameter values. This method will query the database to discover the parameters for the + /// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. + /// + /// + /// This method provides no access to output parameters or the stored procedure's return value parameter. + /// + /// e.g.: + /// int result = ExecuteNonQuery(connString, "PublishOrders", 24, 36); + /// + /// a valid connection string for a OracleConnection + /// the name of the stored prcedure + /// an array of objects to be assigned as the input values of the stored procedure + /// an int representing the number of rows affected by the command + public static int ExecuteNonQuery(string connectionString, string spName, params object[] parameterValues) + { + //if we receive parameter values, we need to figure out where they go + if ((parameterValues != null) && (parameterValues.Length > 0)) + { + //pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache) + OracleParameter[] commandParameters = OracleHelperParameterCache.GetSpParameterSet(connectionString, spName); + + //assign the provided values to these parameters based on parameter order + AssignParameterValues(commandParameters, parameterValues); + + //call the overload that takes an array of SqlParameters + return ExecuteNonQuery(connectionString, CommandType.StoredProcedure, spName, commandParameters); + } + //otherwise we can just call the SP without params + return ExecuteNonQuery(connectionString, CommandType.StoredProcedure, spName); + } + + /// + /// Execute a SqlCommand (that returns no resultset and takes no parameters) against the provided OracleConnection. + /// + /// + /// e.g.: + /// int result = ExecuteNonQuery(conn, CommandType.StoredProcedure, "PublishOrders"); + /// + /// a valid OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an int representing the number of rows affected by the command + public static int ExecuteNonQuery(OracleConnection connection, CommandType commandType, string commandText) + { + //pass through the call providing null for the set of SqlParameters + return ExecuteNonQuery(connection, commandType, commandText, null); + } + + /// + /// Execute a SqlCommand (that returns no resultset) against the specified OracleConnection + /// using the provided parameters. + /// + /// + /// e.g.: + /// int result = ExecuteNonQuery(conn, CommandType.StoredProcedure, "PublishOrders", new OracleParameter("@prodid", 24)); + /// + /// a valid OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an array of SqlParamters used to execute the command + /// an int representing the number of rows affected by the command + public static int ExecuteNonQuery(OracleConnection connection, CommandType commandType, string commandText, params OracleParameter[] commandParameters) + { + //create a command and prepare it for execution + + OracleCommand cmd = new OracleCommand(); + PrepareCommand(cmd, connection, null, commandType, commandText, commandParameters); + + //finally, execute the command. + int retval = cmd.ExecuteNonQuery(); + + // detach the SqlParameters from the command object, so they can be used again. + cmd.Parameters.Clear(); + return retval; + } + + public static int ExecuteNonQueryWithTimeout(string connectionString, CommandType commandType, string commandText, int cmdTimeout) + { + //create a command and prepare it for execution + using (OracleConnection cn = new OracleConnection(connectionString)) + { + cn.Open(); + OracleCommand cmd = new OracleCommand(); + PrepareCommand(cmd, cn, null, commandType, commandText, null); + cmd.CommandTimeout = cmdTimeout; + //finally, execute the command. + int retval = cmd.ExecuteNonQuery(); + + // detach the SqlParameters from the command object, so they can be used again. + cmd.Parameters.Clear(); + return retval; + } + + } + /// + /// Execute a stored procedure via a SqlCommand (that returns no resultset) against the specified OracleConnection + /// using the provided parameter values. This method will query the database to discover the parameters for the + /// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. + /// + /// + /// This method provides no access to output parameters or the stored procedure's return value parameter. + /// + /// e.g.: + /// int result = ExecuteNonQuery(conn, "PublishOrders", 24, 36); + /// + /// a valid OracleConnection + /// the name of the stored procedure + /// an array of objects to be assigned as the input values of the stored procedure + /// an int representing the number of rows affected by the command + public static int ExecuteNonQuery(OracleConnection connection, string spName, params object[] parameterValues) + { + //if we receive parameter values, we need to figure out where they go + if ((parameterValues != null) && (parameterValues.Length > 0)) + { + //pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache) + OracleParameter[] commandParameters = OracleHelperParameterCache.GetSpParameterSet(connection.ConnectionString, spName); + + //assign the provided values to these parameters based on parameter order + AssignParameterValues(commandParameters, parameterValues); + + //call the overload that takes an array of SqlParameters + return ExecuteNonQuery(connection, CommandType.StoredProcedure, spName, commandParameters); + } + //otherwise we can just call the SP without params + return ExecuteNonQuery(connection, CommandType.StoredProcedure, spName); + } + + /// + /// Execute a SqlCommand (that returns no resultset and takes no parameters) against the provided OracleTransaction. + /// + /// + /// e.g.: + /// int result = ExecuteNonQuery(trans, CommandType.StoredProcedure, "PublishOrders"); + /// + /// a valid OracleTransaction + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an int representing the number of rows affected by the command + public static int ExecuteNonQuery(OracleTransaction transaction, CommandType commandType, string commandText) + { + //pass through the call providing null for the set of SqlParameters + return ExecuteNonQuery(transaction, commandType, commandText, null); + } + + /// + /// Execute a SqlCommand (that returns no resultset) against the specified OracleTransaction + /// using the provided parameters. + /// + /// + /// e.g.: + /// int result = ExecuteNonQuery(trans, CommandType.StoredProcedure, "GetOrders", new OracleParameter("@prodid", 24)); + /// + /// a valid OracleTransaction + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an array of SqlParamters used to execute the command + /// an int representing the number of rows affected by the command + public static int ExecuteNonQuery(OracleTransaction transaction, CommandType commandType, string commandText, params OracleParameter[] commandParameters) + { + //create a command and prepare it for execution + OracleCommand cmd = new OracleCommand(); + PrepareCommand(cmd, transaction.Connection, transaction, commandType, commandText, commandParameters); + + //finally, execute the command. + int retval = cmd.ExecuteNonQuery(); + + // detach the SqlParameters from the command object, so they can be used again. + cmd.Parameters.Clear(); + return retval; + } + + /// + /// Execute a stored procedure via a SqlCommand (that returns no resultset) against the specified + /// OracleTransaction using the provided parameter values. This method will query the database to discover the parameters for the + /// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. + /// + /// + /// This method provides no access to output parameters or the stored procedure's return value parameter. + /// + /// e.g.: + /// int result = ExecuteNonQuery(conn, trans, "PublishOrders", 24, 36); + /// + /// a valid OracleTransaction + /// the name of the stored procedure + /// an array of objects to be assigned as the input values of the stored procedure + /// an int representing the number of rows affected by the command + public static int ExecuteNonQuery(OracleTransaction transaction, string spName, params object[] parameterValues) + { + //if we receive parameter values, we need to figure out where they go + if ((parameterValues != null) && (parameterValues.Length > 0)) + { + //pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache) + OracleParameter[] commandParameters = OracleHelperParameterCache.GetSpParameterSet(transaction.Connection.ConnectionString, spName); + + //assign the provided values to these parameters based on parameter order + AssignParameterValues(commandParameters, parameterValues); + + //call the overload that takes an array of SqlParameters + return ExecuteNonQuery(transaction, CommandType.StoredProcedure, spName, commandParameters); + } + //otherwise we can just call the SP without params + return ExecuteNonQuery(transaction, CommandType.StoredProcedure, spName); + } + + + #endregion ExecuteNonQuery + + #region ExecuteDataSet + + /// + /// Execute a SqlCommand (that returns a resultset and takes no parameters) against the database specified in + /// the connection string. + /// + /// + /// e.g.: + /// DataSet ds = ExecuteDataset(connString, CommandType.StoredProcedure, "GetOrders"); + /// + /// a valid connection string for a OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// a dataset containing the resultset generated by the command + public static DataSet ExecuteDataset(string connectionString, CommandType commandType, string commandText) + { + //pass through the call providing null for the set of SqlParameters + return ExecuteDataset(connectionString, commandType, commandText, null); + } + + /// + /// Execute a SqlCommand (that returns a resultset) against the database specified in the connection string + /// using the provided parameters. + /// + /// + /// e.g.: + /// DataSet ds = ExecuteDataset(connString, CommandType.StoredProcedure, "GetOrders", new OracleParameter("@prodid", 24)); + /// + /// a valid connection string for a OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an array of SqlParamters used to execute the command + /// a dataset containing the resultset generated by the command + public static DataSet ExecuteDataset(string connectionString, CommandType commandType, string commandText, params OracleParameter[] commandParameters) + { + //create & open a OracleConnection, and dispose of it after we are done. + using (OracleConnection cn = new OracleConnection(connectionString)) + { + cn.Open(); + + //call the overload that takes a connection in place of the connection string + return ExecuteDataset(cn, commandType, commandText, commandParameters); + } + } + + /// + /// Execute a stored procedure via a SqlCommand (that returns a resultset) against the database specified in + /// the connection string using the provided parameter values. This method will query the database to discover the parameters for the + /// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. + /// + /// + /// This method provides no access to output parameters or the stored procedure's return value parameter. + /// + /// e.g.: + /// DataSet ds = ExecuteDataset(connString, "GetOrders", 24, 36); + /// + /// a valid connection string for a OracleConnection + /// the name of the stored procedure + /// an array of objects to be assigned as the input values of the stored procedure + /// a dataset containing the resultset generated by the command + public static DataSet ExecuteDataset(string connectionString, string spName, params object[] parameterValues) + { + //if we receive parameter values, we need to figure out where they go + if ((parameterValues != null) && (parameterValues.Length > 0)) + { + //pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache) + OracleParameter[] commandParameters = OracleHelperParameterCache.GetSpParameterSet(connectionString, spName); + + //assign the provided values to these parameters based on parameter order + AssignParameterValues(commandParameters, parameterValues); + + //call the overload that takes an array of SqlParameters + return ExecuteDataset(connectionString, CommandType.StoredProcedure, spName, commandParameters); + } + //otherwise we can just call the SP without params + return ExecuteDataset(connectionString, CommandType.StoredProcedure, spName); + } + + /// + /// Execute a SqlCommand (that returns a resultset and takes no parameters) against the provided OracleConnection. + /// + /// + /// e.g.: + /// DataSet ds = ExecuteDataset(conn, CommandType.StoredProcedure, "GetOrders"); + /// + /// a valid OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// a dataset containing the resultset generated by the command + public static DataSet ExecuteDataset(OracleConnection connection, CommandType commandType, string commandText) + { + //pass through the call providing null for the set of SqlParameters + return ExecuteDataset(connection, commandType, commandText, null); + } + + /// + /// Execute a SqlCommand (that returns a resultset) against the specified OracleConnection + /// using the provided parameters. + /// + /// + /// e.g.: + /// DataSet ds = ExecuteDataset(conn, CommandType.StoredProcedure, "GetOrders", new OracleParameter("@prodid", 24)); + /// + /// a valid OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an array of SqlParamters used to execute the command + /// a dataset containing the resultset generated by the command + public static DataSet ExecuteDataset(OracleConnection connection, CommandType commandType, string commandText, params OracleParameter[] commandParameters) + { + //create a command and prepare it for execution + OracleCommand cmd = new OracleCommand(); + PrepareCommand(cmd, connection, null, commandType, commandText, commandParameters); + + //create the DataAdapter & DataSet + OracleDataAdapter da = new OracleDataAdapter(cmd); + DataSet ds = new DataSet(); + + //fill the DataSet using default values for DataTable names, etc. + da.Fill(ds); + + // detach the SqlParameters from the command object, so they can be used again. + cmd.Parameters.Clear(); + + //return the dataset + return ds; + } + + /// + /// Execute a stored procedure via a SqlCommand (that returns a resultset) against the specified OracleConnection + /// using the provided parameter values. This method will query the database to discover the parameters for the + /// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. + /// + /// + /// This method provides no access to output parameters or the stored procedure's return value parameter. + /// + /// e.g.: + /// DataSet ds = ExecuteDataset(conn, "GetOrders", 24, 36); + /// + /// a valid OracleConnection + /// the name of the stored procedure + /// an array of objects to be assigned as the input values of the stored procedure + /// a dataset containing the resultset generated by the command + public static DataSet ExecuteDataset(OracleConnection connection, string spName, params object[] parameterValues) + { + //if we receive parameter values, we need to figure out where they go + if ((parameterValues != null) && (parameterValues.Length > 0)) + { + //pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache) + OracleParameter[] commandParameters = OracleHelperParameterCache.GetSpParameterSet(connection.ConnectionString, spName); + + //assign the provided values to these parameters based on parameter order + AssignParameterValues(commandParameters, parameterValues); + + //call the overload that takes an array of SqlParameters + return ExecuteDataset(connection, CommandType.StoredProcedure, spName, commandParameters); + } + //otherwise we can just call the SP without params + return ExecuteDataset(connection, CommandType.StoredProcedure, spName); + } + + /// + /// Execute a SqlCommand (that returns a resultset and takes no parameters) against the provided OracleTransaction. + /// + /// + /// e.g.: + /// DataSet ds = ExecuteDataset(trans, CommandType.StoredProcedure, "GetOrders"); + /// + /// a valid OracleTransaction + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// a dataset containing the resultset generated by the command + public static DataSet ExecuteDataset(OracleTransaction transaction, CommandType commandType, string commandText) + { + //pass through the call providing null for the set of SqlParameters + return ExecuteDataset(transaction, commandType, commandText, null); + } + + /// + /// Execute a SqlCommand (that returns a resultset) against the specified OracleTransaction + /// using the provided parameters. + /// + /// + /// e.g.: + /// DataSet ds = ExecuteDataset(trans, CommandType.StoredProcedure, "GetOrders", new OracleParameter("@prodid", 24)); + /// + /// a valid OracleTransaction + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an array of SqlParamters used to execute the command + /// a dataset containing the resultset generated by the command + public static DataSet ExecuteDataset(OracleTransaction transaction, CommandType commandType, string commandText, params OracleParameter[] commandParameters) + { + //create a command and prepare it for execution + OracleCommand cmd = new OracleCommand(); + PrepareCommand(cmd, transaction.Connection, transaction, commandType, commandText, commandParameters); + + //create the DataAdapter & DataSet + OracleDataAdapter da = new OracleDataAdapter(cmd); + DataSet ds = new DataSet(); + + //fill the DataSet using default values for DataTable names, etc. + da.Fill(ds); + + // detach the SqlParameters from the command object, so they can be used again. + cmd.Parameters.Clear(); + + //return the dataset + return ds; + } + + /// + /// Execute a stored procedure via a SqlCommand (that returns a resultset) against the specified + /// OracleTransaction using the provided parameter values. This method will query the database to discover the parameters for the + /// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. + /// + /// + /// This method provides no access to output parameters or the stored procedure's return value parameter. + /// + /// e.g.: + /// DataSet ds = ExecuteDataset(trans, "GetOrders", 24, 36); + /// + /// a valid OracleTransaction + /// the name of the stored procedure + /// an array of objects to be assigned as the input values of the stored procedure + /// a dataset containing the resultset generated by the command + public static DataSet ExecuteDataset(OracleTransaction transaction, string spName, params object[] parameterValues) + { + //if we receive parameter values, we need to figure out where they go + if ((parameterValues != null) && (parameterValues.Length > 0)) + { + //pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache) + OracleParameter[] commandParameters = OracleHelperParameterCache.GetSpParameterSet(transaction.Connection.ConnectionString, spName); + + //assign the provided values to these parameters based on parameter order + AssignParameterValues(commandParameters, parameterValues); + + //call the overload that takes an array of SqlParameters + return ExecuteDataset(transaction, CommandType.StoredProcedure, spName, commandParameters); + } + //otherwise we can just call the SP without params + return ExecuteDataset(transaction, CommandType.StoredProcedure, spName); + } + + #endregion ExecuteDataSet + + #region ExecuteReader + + /// + /// this enum is used to indicate whether the connection was provided by the caller, or created by SqlHelper, so that + /// we can set the appropriate CommandBehavior when calling ExecuteReader() + /// + private enum OracleConnectionOwnership + { + /// Connection is owned and managed by SqlHelper + Internal, + /// Connection is owned and managed by the caller + External + } + + /// + /// Create and prepare a SqlCommand, and call ExecuteReader with the appropriate CommandBehavior. + /// + /// + /// If we created and opened the connection, we want the connection to be closed when the DataReader is closed. + /// + /// If the caller provided the connection, we want to leave it to them to manage. + /// + /// a valid OracleConnection, on which to execute this command + /// a valid OracleTransaction, or 'null' + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an array of SqlParameters to be associated with the command or 'null' if no parameters are required + /// indicates whether the connection parameter was provided by the caller, or created by SqlHelper + /// SqlDataReader containing the results of the command + private static OracleDataReader ExecuteReader(OracleConnection connection, OracleTransaction transaction, CommandType commandType, string commandText, OracleParameter[] commandParameters, OracleConnectionOwnership connectionOwnership) + { + //create a command and prepare it for execution + OracleCommand cmd = new OracleCommand(); + PrepareCommand(cmd, connection, transaction, commandType, commandText, commandParameters); + + //create a reader + OracleDataReader dr; + + // call ExecuteReader with the appropriate CommandBehavior + if (connectionOwnership == OracleConnectionOwnership.External) + { + dr = cmd.ExecuteReader(); + } + else + { + dr = cmd.ExecuteReader(CommandBehavior.CloseConnection); + + } + + // detach the SqlParameters from the command object, so they can be used again. + cmd.Parameters.Clear(); + + return dr; + } + + /// + /// Execute a SqlCommand (that returns a resultset and takes no parameters) against the database specified in + /// the connection string. + /// + /// + /// e.g.: + /// SqlDataReader dr = ExecuteReader(connString, CommandType.StoredProcedure, "GetOrders"); + /// + /// a valid connection string for a OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// a SqlDataReader containing the resultset generated by the command + public static OracleDataReader ExecuteReader(string connectionString, CommandType commandType, string commandText) + { + //pass through the call providing null for the set of SqlParameters + return ExecuteReader(connectionString, commandType, commandText, null); + } + + /// + /// Execute a SqlCommand (that returns a resultset) against the database specified in the connection string + /// using the provided parameters. + /// + /// + /// e.g.: + /// SqlDataReader dr = ExecuteReader(connString, CommandType.StoredProcedure, "GetOrders", new OracleParameter("@prodid", 24)); + /// + /// a valid connection string for a OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an array of SqlParamters used to execute the command + /// a SqlDataReader containing the resultset generated by the command + public static OracleDataReader ExecuteReader(string connectionString, CommandType commandType, string commandText, params OracleParameter[] commandParameters) + { + //create & open a OracleConnection + OracleConnection cn = new OracleConnection(connectionString); + cn.Open(); + + try + { + //call the private overload that takes an internally owned connection in place of the connection string + return ExecuteReader(cn, null, commandType, commandText, commandParameters, OracleConnectionOwnership.Internal); + } + catch + { + //if we fail to return the SqlDatReader, we need to close the connection ourselves + cn.Close(); + throw; + } + } + + /// + /// Execute a stored procedure via a SqlCommand (that returns a resultset) against the database specified in + /// the connection string using the provided parameter values. This method will query the database to discover the parameters for the + /// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. + /// + /// + /// This method provides no access to output parameters or the stored procedure's return value parameter. + /// + /// e.g.: + /// SqlDataReader dr = ExecuteReader(connString, "GetOrders", 24, 36); + /// + /// a valid connection string for a OracleConnection + /// the name of the stored procedure + /// an array of objects to be assigned as the input values of the stored procedure + /// a SqlDataReader containing the resultset generated by the command + public static OracleDataReader ExecuteReader(string connectionString, string spName, params object[] parameterValues) + { + //if we receive parameter values, we need to figure out where they go + if ((parameterValues != null) && (parameterValues.Length > 0)) + { + //pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache) + OracleParameter[] commandParameters = OracleHelperParameterCache.GetSpParameterSet(connectionString, spName); + + //assign the provided values to these parameters based on parameter order + AssignParameterValues(commandParameters, parameterValues); + + //call the overload that takes an array of SqlParameters + return ExecuteReader(connectionString, CommandType.StoredProcedure, spName, commandParameters); + } + //otherwise we can just call the SP without params + return ExecuteReader(connectionString, CommandType.StoredProcedure, spName); + } + + /// + /// Execute a SqlCommand (that returns a resultset and takes no parameters) against the provided OracleConnection. + /// + /// + /// e.g.: + /// SqlDataReader dr = ExecuteReader(conn, CommandType.StoredProcedure, "GetOrders"); + /// + /// a valid OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// a SqlDataReader containing the resultset generated by the command + public static OracleDataReader ExecuteReader(OracleConnection connection, CommandType commandType, string commandText) + { + //pass through the call providing null for the set of SqlParameters + return ExecuteReader(connection, commandType, commandText, null); + } + + /// + /// Execute a SqlCommand (that returns a resultset) against the specified OracleConnection + /// using the provided parameters. + /// + /// + /// e.g.: + /// SqlDataReader dr = ExecuteReader(conn, CommandType.StoredProcedure, "GetOrders", new OracleParameter("@prodid", 24)); + /// + /// a valid OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an array of SqlParamters used to execute the command + /// a SqlDataReader containing the resultset generated by the command + public static OracleDataReader ExecuteReader(OracleConnection connection, CommandType commandType, string commandText, params OracleParameter[] commandParameters) + { + //pass through the call to the private overload using a null transaction value and an externally owned connection + return ExecuteReader(connection, null, commandType, commandText, commandParameters, OracleConnectionOwnership.External); + } + + /// + /// Execute a stored procedure via a SqlCommand (that returns a resultset) against the specified OracleConnection + /// using the provided parameter values. This method will query the database to discover the parameters for the + /// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. + /// + /// + /// This method provides no access to output parameters or the stored procedure's return value parameter. + /// + /// e.g.: + /// SqlDataReader dr = ExecuteReader(conn, "GetOrders", 24, 36); + /// + /// a valid OracleConnection + /// the name of the stored procedure + /// an array of objects to be assigned as the input values of the stored procedure + /// a SqlDataReader containing the resultset generated by the command + public static OracleDataReader ExecuteReader(OracleConnection connection, string spName, params object[] parameterValues) + { + //if we receive parameter values, we need to figure out where they go + if ((parameterValues != null) && (parameterValues.Length > 0)) + { + OracleParameter[] commandParameters = OracleHelperParameterCache.GetSpParameterSet(connection.ConnectionString, spName); + + AssignParameterValues(commandParameters, parameterValues); + + return ExecuteReader(connection, CommandType.StoredProcedure, spName, commandParameters); + } + //otherwise we can just call the SP without params + return ExecuteReader(connection, CommandType.StoredProcedure, spName); + } + + /// + /// Execute a SqlCommand (that returns a resultset and takes no parameters) against the provided OracleTransaction. + /// + /// + /// e.g.: + /// SqlDataReader dr = ExecuteReader(trans, CommandType.StoredProcedure, "GetOrders"); + /// + /// a valid OracleTransaction + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// a SqlDataReader containing the resultset generated by the command + public static OracleDataReader ExecuteReader(OracleTransaction transaction, CommandType commandType, string commandText) + { + //pass through the call providing null for the set of SqlParameters + return ExecuteReader(transaction, commandType, commandText, null); + } + + /// + /// Execute a SqlCommand (that returns a resultset) against the specified OracleTransaction + /// using the provided parameters. + /// + /// + /// e.g.: + /// SqlDataReader dr = ExecuteReader(trans, CommandType.StoredProcedure, "GetOrders", new OracleParameter("@prodid", 24)); + /// + /// a valid OracleTransaction + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an array of SqlParamters used to execute the command + /// a SqlDataReader containing the resultset generated by the command + public static OracleDataReader ExecuteReader(OracleTransaction transaction, CommandType commandType, string commandText, params OracleParameter[] commandParameters) + { + //pass through to private overload, indicating that the connection is owned by the caller + return ExecuteReader(transaction.Connection, transaction, commandType, commandText, commandParameters, OracleConnectionOwnership.External); + } + + /// + /// Execute a stored procedure via a SqlCommand (that returns a resultset) against the specified + /// OracleTransaction using the provided parameter values. This method will query the database to discover the parameters for the + /// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. + /// + /// + /// This method provides no access to output parameters or the stored procedure's return value parameter. + /// + /// e.g.: + /// SqlDataReader dr = ExecuteReader(trans, "GetOrders", 24, 36); + /// + /// a valid OracleTransaction + /// the name of the stored procedure + /// an array of objects to be assigned as the input values of the stored procedure + /// a SqlDataReader containing the resultset generated by the command + public static OracleDataReader ExecuteReader(OracleTransaction transaction, string spName, params object[] parameterValues) + { + //if we receive parameter values, we need to figure out where they go + if ((parameterValues != null) && (parameterValues.Length > 0)) + { + OracleParameter[] commandParameters = OracleHelperParameterCache.GetSpParameterSet(transaction.Connection.ConnectionString, spName); + + AssignParameterValues(commandParameters, parameterValues); + + return ExecuteReader(transaction, CommandType.StoredProcedure, spName, commandParameters); + } + //otherwise we can just call the SP without params + return ExecuteReader(transaction, CommandType.StoredProcedure, spName); + } + + #endregion ExecuteReader + + #region ExecuteScalar + + /// + /// Execute a OracleCommand (that returns a 1x1 resultset and takes no parameters) against the database specified in + /// the connection string. + /// + /// + /// e.g.: + /// int orderCount = (int)ExecuteScalar(connString, CommandType.StoredProcedure, "GetOrderCount"); + /// + /// a valid connection string for a OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an object containing the value in the 1x1 resultset generated by the command + public static object ExecuteScalar(string connectionString, CommandType commandType, string commandText) + { + //pass through the call providing null for the set of SqlParameters + return ExecuteScalar(connectionString, commandType, commandText, null); + } + + /// + /// Execute a OracleCommand (that returns a 1x1 resultset) against the database specified in the connection string + /// using the provided parameters. + /// + /// + /// e.g.: + /// int orderCount = (int)ExecuteScalar(connString, CommandType.StoredProcedure, "GetOrderCount", new OracleParameter("@prodid", 24)); + /// + /// a valid connection string for a OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an array of SqlParamters used to execute the command + /// an object containing the value in the 1x1 resultset generated by the command + public static object ExecuteScalar(string connectionString, CommandType commandType, string commandText, params OracleParameter[] commandParameters) + { + //create & open a OracleConnection, and dispose of it after we are done. + using (OracleConnection cn = new OracleConnection(connectionString)) + { + cn.Open(); + + //call the overload that takes a connection in place of the connection string + return ExecuteScalar(cn, commandType, commandText, commandParameters); + } + } + + /// + /// Execute a stored procedure via a OracleCommand (that returns a 1x1 resultset) against the database specified in + /// the connection string using the provided parameter values. This method will query the database to discover the parameters for the + /// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. + /// + /// + /// This method provides no access to output parameters or the stored procedure's return value parameter. + /// + /// e.g.: + /// int orderCount = (int)ExecuteScalar(connString, "GetOrderCount", 24, 36); + /// + /// a valid connection string for a OracleConnection + /// the name of the stored procedure + /// an array of objects to be assigned as the input values of the stored procedure + /// an object containing the value in the 1x1 resultset generated by the command + public static object ExecuteScalar(string connectionString, string spName, params object[] parameterValues) + { + //if we receive parameter values, we need to figure out where they go + if ((parameterValues != null) && (parameterValues.Length > 0)) + { + //pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache) + OracleParameter[] commandParameters = OracleHelperParameterCache.GetSpParameterSet(connectionString, spName); + + //assign the provided values to these parameters based on parameter order + AssignParameterValues(commandParameters, parameterValues); + + //call the overload that takes an array of SqlParameters + return ExecuteScalar(connectionString, CommandType.StoredProcedure, spName, commandParameters); + } + //otherwise we can just call the SP without params + return ExecuteScalar(connectionString, CommandType.StoredProcedure, spName); + } + + /// + /// Execute a OracleCommand (that returns a 1x1 resultset and takes no parameters) against the provided OracleConnection. + /// + /// + /// e.g.: + /// int orderCount = (int)ExecuteScalar(conn, CommandType.StoredProcedure, "GetOrderCount"); + /// + /// a valid OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an object containing the value in the 1x1 resultset generated by the command + public static object ExecuteScalar(OracleConnection connection, CommandType commandType, string commandText) + { + //pass through the call providing null for the set of SqlParameters + return ExecuteScalar(connection, commandType, commandText, null); + } + + /// + /// Execute a OracleCommand (that returns a 1x1 resultset) against the specified OracleConnection + /// using the provided parameters. + /// + /// + /// e.g.: + /// int orderCount = (int)ExecuteScalar(conn, CommandType.StoredProcedure, "GetOrderCount", new OracleParameter("@prodid", 24)); + /// + /// a valid OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an array of SqlParamters used to execute the command + /// an object containing the value in the 1x1 resultset generated by the command + public static object ExecuteScalar(OracleConnection connection, CommandType commandType, string commandText, params OracleParameter[] commandParameters) + { + //create a command and prepare it for execution + OracleCommand cmd = new OracleCommand(); + PrepareCommand(cmd, connection, null, commandType, commandText, commandParameters); + + //execute the command & return the results + object retval = cmd.ExecuteScalar(); + + // detach the SqlParameters from the command object, so they can be used again. + cmd.Parameters.Clear(); + return retval; + + } + + /// + /// Execute a stored procedure via a OracleCommand (that returns a 1x1 resultset) against the specified OracleConnection + /// using the provided parameter values. This method will query the database to discover the parameters for the + /// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. + /// + /// + /// This method provides no access to output parameters or the stored procedure's return value parameter. + /// + /// e.g.: + /// int orderCount = (int)ExecuteScalar(conn, "GetOrderCount", 24, 36); + /// + /// a valid OracleConnection + /// the name of the stored procedure + /// an array of objects to be assigned as the input values of the stored procedure + /// an object containing the value in the 1x1 resultset generated by the command + public static object ExecuteScalar(OracleConnection connection, string spName, params object[] parameterValues) + { + //if we receive parameter values, we need to figure out where they go + if ((parameterValues != null) && (parameterValues.Length > 0)) + { + //pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache) + OracleParameter[] commandParameters = OracleHelperParameterCache.GetSpParameterSet(connection.ConnectionString, spName); + + //assign the provided values to these parameters based on parameter order + AssignParameterValues(commandParameters, parameterValues); + + //call the overload that takes an array of SqlParameters + return ExecuteScalar(connection, CommandType.StoredProcedure, spName, commandParameters); + } + //otherwise we can just call the SP without params + return ExecuteScalar(connection, CommandType.StoredProcedure, spName); + } + + /// + /// Execute a OracleCommand (that returns a 1x1 resultset and takes no parameters) against the provided OracleTransaction. + /// + /// + /// e.g.: + /// int orderCount = (int)ExecuteScalar(trans, CommandType.StoredProcedure, "GetOrderCount"); + /// + /// a valid OracleTransaction + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an object containing the value in the 1x1 resultset generated by the command + public static object ExecuteScalar(OracleTransaction transaction, CommandType commandType, string commandText) + { + //pass through the call providing null for the set of SqlParameters + return ExecuteScalar(transaction, commandType, commandText, null); + } + + /// + /// Execute a OracleCommand (that returns a 1x1 resultset) against the specified OracleTransaction + /// using the provided parameters. + /// + /// + /// e.g.: + /// int orderCount = (int)ExecuteScalar(trans, CommandType.StoredProcedure, "GetOrderCount", new OracleParameter("@prodid", 24)); + /// + /// a valid OracleTransaction + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an array of SqlParamters used to execute the command + /// an object containing the value in the 1x1 resultset generated by the command + public static object ExecuteScalar(OracleTransaction transaction, CommandType commandType, string commandText, params OracleParameter[] commandParameters) + { + //create a command and prepare it for execution + OracleCommand cmd = new OracleCommand(); + PrepareCommand(cmd, transaction.Connection, transaction, commandType, commandText, commandParameters); + + //execute the command & return the results + object retval = cmd.ExecuteScalar(); + + // detach the SqlParameters from the command object, so they can be used again. + cmd.Parameters.Clear(); + return retval; + } + + /// + /// Execute a stored procedure via a OracleCommand (that returns a 1x1 resultset) against the specified + /// OracleTransaction using the provided parameter values. This method will query the database to discover the parameters for the + /// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. + /// + /// + /// This method provides no access to output parameters or the stored procedure's return value parameter. + /// + /// e.g.: + /// int orderCount = (int)ExecuteScalar(trans, "GetOrderCount", 24, 36); + /// + /// a valid OracleTransaction + /// the name of the stored procedure + /// an array of objects to be assigned as the input values of the stored procedure + /// an object containing the value in the 1x1 resultset generated by the command + public static object ExecuteScalar(OracleTransaction transaction, string spName, params object[] parameterValues) + { + //if we receive parameter values, we need to figure out where they go + if ((parameterValues != null) && (parameterValues.Length > 0)) + { + //pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache) + OracleParameter[] commandParameters = OracleHelperParameterCache.GetSpParameterSet(transaction.Connection.ConnectionString, spName); + + //assign the provided values to these parameters based on parameter order + AssignParameterValues(commandParameters, parameterValues); + + //call the overload that takes an array of SqlParameters + return ExecuteScalar(transaction, CommandType.StoredProcedure, spName, commandParameters); + } + //otherwise we can just call the SP without params + return ExecuteScalar(transaction, CommandType.StoredProcedure, spName); + } + + #endregion ExecuteScalar + + + } + /// + /// OracleHelperParameterCache provides functions to leverage a static cache of procedure parameters, and the + /// ability to discover parameters for stored procedures at run-time. + /// + /// + + public sealed class OracleHelperParameterCache + { + #region private methods, variables, and constructors + + //Since this class provides only static methods, make the default constructor private to prevent + //instances from being created with "new SqlHelperParameterCache()". + private OracleHelperParameterCache() { } + + private static Hashtable paramCache = Hashtable.Synchronized(new Hashtable()); + + /// + /// resolve at run time the appropriate set of SqlParameters for a stored procedure + /// + /// a valid connection string for a OracleConnection + /// the name of the stored procedure + /// whether or not to include their return value parameter + /// + private static OracleParameter[] DiscoverSpParameterSet(string connectionString, string spName, bool includeReturnValueParameter) + { + using (OracleConnection cn = new OracleConnection(connectionString)) + using (OracleCommand cmd = new OracleCommand(spName, cn)) + { + cn.Open(); + cmd.CommandType = CommandType.StoredProcedure; + OracleCommandBuilder.DeriveParameters(cmd); + + if (!includeReturnValueParameter) + { + cmd.Parameters.RemoveAt(0); + } + + OracleParameter[] discoveredParameters = new OracleParameter[cmd.Parameters.Count]; ; + + cmd.Parameters.CopyTo(discoveredParameters, 0); + + return discoveredParameters; + } + } + + //deep copy of cached OracleParameter array + private static OracleParameter[] CloneParameters(OracleParameter[] originalParameters) + { + OracleParameter[] clonedParameters = new OracleParameter[originalParameters.Length]; + + for (int i = 0, j = originalParameters.Length; i < j; i++) + { + clonedParameters[i] = (OracleParameter)((ICloneable)originalParameters[i]).Clone(); + } + + return clonedParameters; + } + + #endregion private methods, variables, and constructors + + #region caching functions + + /// + /// add parameter array to the cache + /// + /// a valid connection string for a OracleConnection + /// the stored procedure name or T-SQL command + /// an array of SqlParamters to be cached + public static void CacheParameterSet(string connectionString, string commandText, params OracleParameter[] commandParameters) + { + string hashKey = connectionString + ":" + commandText; + + paramCache[hashKey] = commandParameters; + } + + /// + /// retrieve a parameter array from the cache + /// + /// a valid connection string for a OracleConnection + /// the stored procedure name or T-SQL command + /// an array of SqlParamters + public static OracleParameter[] GetCachedParameterSet(string connectionString, string commandText) + { + string hashKey = connectionString + ":" + commandText; + + OracleParameter[] cachedParameters = (OracleParameter[])paramCache[hashKey]; + + if (cachedParameters == null) + { + return null; + } + return CloneParameters(cachedParameters); + } + + #endregion caching functions + + #region Parameter Discovery Functions + + /// + /// Retrieves the set of SqlParameters appropriate for the stored procedure + /// + /// + /// This method will query the database for this information, and then store it in a cache for future requests. + /// + /// a valid connection string for a OracleConnection + /// the name of the stored procedure + /// an array of SqlParameters + public static OracleParameter[] GetSpParameterSet(string connectionString, string spName) + { + return GetSpParameterSet(connectionString, spName, false); + } + + /// + /// Retrieves the set of SqlParameters appropriate for the stored procedure + /// + /// + /// This method will query the database for this information, and then store it in a cache for future requests. + /// + /// a valid connection string for a OracleConnection + /// the name of the stored procedure + /// a bool value indicating whether the return value parameter should be included in the results + /// an array of SqlParameters + public static OracleParameter[] GetSpParameterSet(string connectionString, string spName, bool includeReturnValueParameter) + { + string hashKey = connectionString + ":" + spName + (includeReturnValueParameter ? ":include ReturnValue Parameter" : ""); + + OracleParameter[] cachedParameters; + + cachedParameters = (OracleParameter[])paramCache[hashKey]; + + if (cachedParameters == null) + { + cachedParameters = (OracleParameter[])(paramCache[hashKey] = DiscoverSpParameterSet(connectionString, spName, includeReturnValueParameter)); + } + + return CloneParameters(cachedParameters); + } + + #endregion Parameter Discovery Functions + } +} diff --git a/Utility.cs b/Utility.cs index 1429fd9..4e64d66 100644 --- a/Utility.cs +++ b/Utility.cs @@ -17,6 +17,11 @@ { public class Utility { + public static string DBServer; + public static string Database; + public static string UserID; + public static string DBPassword; + public static void SetBallons(GSOBalloon featureTooltip,GSOBalloonEx balloonEx) { featureTooltip.CacheFilePath = Path.GetDirectoryName(Application.ExecutablePath) + "/GeoScene/Globe/Temp"; diff --git a/bin/x64/Debug/LSPipeline.exe b/bin/x64/Debug/LSPipeline.exe index 833a5e5..76f838b 100644 --- a/bin/x64/Debug/LSPipeline.exe +++ b/bin/x64/Debug/LSPipeline.exe Binary files differ diff --git a/bin/x64/Debug/LSPipeline.pdb b/bin/x64/Debug/LSPipeline.pdb index 245e727..28c81dc 100644 --- a/bin/x64/Debug/LSPipeline.pdb +++ b/bin/x64/Debug/LSPipeline.pdb Binary files differ diff --git a/bin/x64/Debug/databaseConfigOracle.xml b/bin/x64/Debug/databaseConfigOracle.xml index 7e48b08..94be70c 100644 --- a/bin/x64/Debug/databaseConfigOracle.xml +++ b/bin/x64/Debug/databaseConfigOracle.xml @@ -2,7 +2,7 @@ True 192.168.0.203 - szhtdb2 - release - release + eydb2 + scott + scott \ No newline at end of file diff --git a/bin/x64/Debug/log.txt b/bin/x64/Debug/log.txt index 5236cc6..73bcf38 100644 --- a/bin/x64/Debug/log.txt +++ b/bin/x64/Debug/log.txt @@ -27704,3 +27704,75 @@ exception over ------------------------------------------------------------ + + exception begin -----------------2016/12/2 9:55:40--------------------- + + + + e.Message:输入字符串的格式不正确。 + + e.Source:mscorlib + + e.TargetSite:Double ParseDouble(System.String, System.Globalization.NumberStyles, System.Globalization.NumberFormatInfo) + + e.StackTrace: 在 System.Number.ParseDouble(String value, NumberStyles options, NumberFormatInfo numfmt) + 在 System.Double.Parse(String s, IFormatProvider provider) + 在 WorldGIS.CtrlEntitySpaceInfo.positionChanged() 位置 D:\LSPipeline\UserControls\CtrlEntitySpaceInfo.cs:行号 113 + + + + exception over ------------------------------------------------------------ + + exception begin -----------------2016/12/2 9:55:41--------------------- + + + + e.Message:输入字符串的格式不正确。 + + e.Source:mscorlib + + e.TargetSite:Double ParseDouble(System.String, System.Globalization.NumberStyles, System.Globalization.NumberFormatInfo) + + e.StackTrace: 在 System.Number.ParseDouble(String value, NumberStyles options, NumberFormatInfo numfmt) + 在 System.Double.Parse(String s, IFormatProvider provider) + 在 WorldGIS.CtrlEntitySpaceInfo.positionChanged() 位置 D:\LSPipeline\UserControls\CtrlEntitySpaceInfo.cs:行号 115 + + + + exception over ------------------------------------------------------------ + + exception begin -----------------2016/12/2 9:55:55--------------------- + + + + e.Message:输入字符串的格式不正确。 + + e.Source:mscorlib + + e.TargetSite:Double ParseDouble(System.String, System.Globalization.NumberStyles, System.Globalization.NumberFormatInfo) + + e.StackTrace: 在 System.Number.ParseDouble(String value, NumberStyles options, NumberFormatInfo numfmt) + 在 System.Double.Parse(String s, IFormatProvider provider) + 在 WorldGIS.CtrlEntitySpaceInfo.positionChanged() 位置 D:\LSPipeline\UserControls\CtrlEntitySpaceInfo.cs:行号 113 + + + + exception over ------------------------------------------------------------ + + exception begin -----------------2016/12/2 9:55:56--------------------- + + + + e.Message:输入字符串的格式不正确。 + + e.Source:mscorlib + + e.TargetSite:Double ParseDouble(System.String, System.Globalization.NumberStyles, System.Globalization.NumberFormatInfo) + + e.StackTrace: 在 System.Number.ParseDouble(String value, NumberStyles options, NumberFormatInfo numfmt) + 在 System.Double.Parse(String s, IFormatProvider provider) + 在 WorldGIS.CtrlEntitySpaceInfo.positionChanged() 位置 D:\LSPipeline\UserControls\CtrlEntitySpaceInfo.cs:行号 115 + + + + exception over ------------------------------------------------------------ diff --git a/obj/Debug/GenerateResource.read.1.tlog b/obj/Debug/GenerateResource.read.1.tlog index b4c2526..95a0a19 100644 --- a/obj/Debug/GenerateResource.read.1.tlog +++ b/obj/Debug/GenerateResource.read.1.tlog Binary files differ diff --git a/FrmDatabaseParaSettingOracle.cs b/FrmDatabaseParaSettingOracle.cs index 18c5e99..6e97dfb 100644 --- a/FrmDatabaseParaSettingOracle.cs +++ b/FrmDatabaseParaSettingOracle.cs @@ -47,12 +47,15 @@ } string serverIp = textBoxIP.Text.Trim(); + /* string hostName = System.Net.Dns.GetHostName(); if (serverIp == hostName || serverIp == "localhost" || serverIp == System.Net.Dns.GetHostAddresses(hostName).GetValue(2).ToString()) { serverIp = "127.0.0.1"; } + * */ + DateTime timeStart = DateTime.Now; GSODataSource ds = globeControl1.Globe.DataManager.GetDataSourceByName(serverIp + "/" + textBoxDatabase.Text.Trim() + "_" + textBoxUser.Text.Trim()); if (ds == null) @@ -83,7 +86,7 @@ connectParams.dataSourceName = ds.Name; connectParams.databaseType = EnumDataSourceType.Oracle; Utility.connectParamsOfDatabase.Add(connectParams); - + setUtilityValue(connectParams); WriteXML(); MessageBox.Show("连接Oracle数据库成功,用时:" + secondsConnectOracle.ToString() + "秒", "提示"); } @@ -92,6 +95,14 @@ this.Close(); } + private void setUtilityValue(DatabaseConnectParams connectParams) + { + Utility.DBServer = connectParams.ip; + Utility.Database = connectParams.databaseName; + Utility.UserID = connectParams.userName; + Utility.DBPassword = connectParams.password; + } + private void ReadXML() { string strFileName = Path.GetDirectoryName(Application.ExecutablePath) + "/databaseConfigOracle.xml"; diff --git a/GXBuilder.cs b/GXBuilder.cs new file mode 100644 index 0000000..b2ec9b2 --- /dev/null +++ b/GXBuilder.cs @@ -0,0 +1,187 @@ +using System; +using System.Data; +using System.Drawing; +using System.Runtime.InteropServices; +using GeoScene.Data; +using GeoScene.Engine; +using GeoScene.Globe; + +namespace WorldGIS +{ + public class GXBuilder : ModelBuilder + { + private static double diameter = 0.1; + + public GXBuilder(GSODataSource ds) + : base(ds) + { + + } + + public override bool validate(GSOLayer layer) + { + return true; + } + + /// + /// + /// + /// 追加或修改 + /// 高程入库或埋深入库 + /// + public override bool doBuild(EnumUpdateMode updateMode, + EnumBuildMode buildMode, + BaseParam param) + { + LineParam lineParam = param as LineParam; + GSOFeatureDataset newFeatureSet = ds.GetDatasetByName(lineParam.layerName) as GSOFeatureDataset; + if (newFeatureSet == null) + { + newFeatureSet = CreateDBFeatureDataset(layer, lineParam.layerName); + } + newFeatureSet.Open(); + GSOFeatures features = layer.GetAllFeatures(true); + for (int i = 0; i < features.Length; i++) + { + GSOFeature f = features[i]; + GSOGeoPolyline3D lineeee = f.Geometry as GSOGeoPolyline3D; + if (lineeee == null || lineeee.GetSpaceLength(true, 6378137) == 0) + { + LogHelper.Error("出现数据无法入库:" + f.ID); + continue; + } + + GSOFeature newFeature = newFeatureSet.CreateFeature(); + + double radius = diameter; //创建光纤的半径 + newFeature.Geometry = updateGemotry(f, lineParam, radius, buildMode); + newFeature.Geometry.Style = getPipeLineStyle(lineParam, f, radius); + newFeature.Name = f.GetFieldAsString(lineParam.uniqueIdFieldName); + setFeatureValueByShapeFeature(f, newFeature); + // newFeatureSet + if (newFeatureSet.GetFeatureByName(newFeature.Name, true).Length > 0) + { + if (!this.UpdateGXDevice(newFeatureSet.GetFeatureByName(newFeature.Name, true)[0], + newFeature)) + { + LogHelper.Error("光纤设备更新失败:" + newFeature.Name+"\r\n"); + } + continue; + } + newFeatureSet.AddFeature(newFeature); + if (!AddGXDevice(newFeature)) + { + LogHelper.Error("光纤数据保存Alarm_Device失败:" + newFeature.Name+"\r\n"); + } + } + newFeatureSet.Save(); + newFeatureSet.Close(); + return true; + } + + private bool AddGXDevice(GSOFeature feature) + { + //保存数据到设备表 + try + { + String deviceType = feature.GetValue("DEVICETYPE") == null + ? "" : feature.GetValue("DEVICETYPE").ToString(); + String devCode = feature.GetValue("DEVICEID") == null + ? "" : feature.GetValue("DEVICEID").ToString(); + String road = feature.GetValue("ROAD") == null + ? "" : feature.GetValue("ROAD").ToString(); + + //TODO LIST: + string sqlCount = "select dbid from alarm_device_type where" + + " typename = '" + deviceType + "'"; + object dbid = OracleUtils.ExecuteScalar(OracleUtils.ConnectionString, + CommandType.Text, sqlCount); + if (dbid == null) + { + return false; + } + int deviceTypeId = int.Parse(dbid.ToString()); + string sql = "Insert into alarm_device (DBID,ACTIVE,DEVCODE,DEVNAME,FACTORY," + + "INSTALLDATE,GAOCHENG,HEIGHT,LATITUDE,LONGTITUDE,DEVICETYPE_ID) " + + "values (SEQ_DEVICE_ID.NEXTVAL, 1, '" + devCode + "', '" + deviceType + devCode + + "', " + "'航天二院', " + "to_date('" + DateTime.Now.ToString() + "','yyyy/MM/dd hh24:mi::ss'), " + + "0, 0, 0, 0, " + deviceTypeId + ")"; + OracleUtils.ExecuteNonQuery(OracleUtils.ConnectionString, CommandType.Text, sql); + + } + catch (Exception e) + { + throw; + } + return true; + } + + private bool UpdateGXDevice(GSOFeature feature, GSOFeature newFeature) + { + String deviceType = newFeature.GetValue("DEVICETYPE") == null + ? "" : newFeature.GetValue("DEVICETYPE").ToString(); + String devCode = newFeature.GetValue("DEVICEID") == null + ? "" : newFeature.GetValue("DEVICEID").ToString(); + String road = newFeature.GetValue("ROAD") == null + ? "" : newFeature.GetValue("ROAD").ToString(); + + feature.Geometry = newFeature.Geometry.Clone(); + this.setFeatureValueByShapeFeature(newFeature,feature); + // feature.Dataset.Save(); + + string sqlCount = "select dbid from alarm_device_type where" + + " typename = '" + deviceType + "'"; + object dbid = OracleUtils.ExecuteScalar(OracleUtils.ConnectionString, + CommandType.Text, sqlCount); + if (dbid == null) + { + return false; + } + int deviceTypeId = int.Parse(dbid.ToString()); + + string sql = "update alarm_device set FACTORY='" + road + + "', DEVICETYPE_ID='" + deviceTypeId + + "', DEVNAME='"+deviceType+devCode+"' "+ + "where devcode='" + devCode + "'"; + OracleUtils.ExecuteNonQuery(OracleUtils.ConnectionString, CommandType.Text, sql); + return true; + } + + private GSOLineStyle3D getPipeLineStyle(LineParam lineParam, GSOFeature f, double radius) + { + GSOPipeLineStyle3D style0 = new GSOPipeLineStyle3D(); + style0.LineColor = Color.FromArgb(lineParam.transparency, lineParam.lineColor); + style0.Slice = lineParam.sliceNum; + style0.CornerSliceAngle = lineParam.cornerSliceAngle; + style0.Radius = radius; + return style0; + } + + private GSOGeometry updateGemotry(GSOFeature f, LineParam lineParam, double radius, EnumBuildMode buildMode) + { + + f.Geometry.AltitudeMode = (buildMode.Equals(EnumBuildMode.Alititude)) ? EnumAltitudeMode.RelativeToGround : EnumAltitudeMode.Absolute; + + GSOGeoPolyline3D line = f.Geometry as GSOGeoPolyline3D; + if (line == null) + { + return null; //log4net 记录错误处理 + } + + double deep1 = 0; + double deep2 = 0; + + GSOPoint3ds pt3ds = new GSOPoint3ds(); + for (int n = 0; n < line[0].Count; n++) + { + GSOPoint3d pt3d = line[0][n]; + pt3d.Z = 0; + + pt3ds.Add(pt3d); + } + line[0] = pt3ds; + return line; + } + + } +} diff --git a/HTForms/FrmPipelineModelDataBase.cs b/HTForms/FrmPipelineModelDataBase.cs index 84a2d7b..3076bdd 100644 --- a/HTForms/FrmPipelineModelDataBase.cs +++ b/HTForms/FrmPipelineModelDataBase.cs @@ -91,6 +91,7 @@ } else datasource = ds; + if (comboBoxExLayer.Text.Trim() == "") { MessageBox.Show("请选择一个图层文件!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning); @@ -126,20 +127,12 @@ comboBoxExLayer.Text)); if (layer == null) return; - FieldValidate fieldValidate = FieldValidateFactory.Create(ValidateConfig.LoadConfig(), - getEnumValidateType()); - - if (!fieldValidate.Validate(layer)) + if (txtModelLayer.Text != "传感设备图层") { - DateTime dt=DateTime.Now; - string logFilePath = Application.StartupPath + "\\log\\" + dt.Year + "\\" + dt.Year + dt.Month + "\\" + dt.Year + - dt.Month + dt.Day + ".txt"; - MessageBox.Show("选择的数据不符合数据规范,详情见日志" + logFilePath, "提示"); - return; + if (!getValidateResult(layer)) + return; } - ModelBuilder lineBuilder = new LineBuilder(datasource); - LineParam lineParam = new LineParam(); lineParam.layerName = txtModelLayer.Text; lineParam.uniqueIdFieldName = cmbID.Text; @@ -149,14 +142,17 @@ lineParam.diameterFieldName = cmbRadius.Text; lineParam.relativeMode = (cmbReference.Text == "管顶") ? 0 : 1; lineParam.lineColor = btnPipelineColor.BackColor; - lineParam.transparency=Convert.ToByte(ComboboxRansparency.Value); + lineParam.transparency = Convert.ToByte(ComboboxRansparency.Value); lineParam.cornerSliceAngle = Convert.ToDouble(textBoxCornerSliceAngle.Text); - lineParam.sliceNum=Convert.ToInt32(txtSlice.Text); + lineParam.sliceNum = Convert.ToInt32(txtSlice.Text); lineParam.channelWidth = comboBoxExWidth.Text; lineParam.channelHeight = comboBoxExHeight.Text; - lineBuilder.build(layer, checkBoxAdd.Checked ? EnumUpdateMode.Append : EnumUpdateMode.Update, - checkBoxDeep.Checked ? EnumBuildMode.Depth : EnumBuildMode.Alititude, lineParam); + if (txtModelLayer.Text != "传感设备图层") + lineBuilder(layer, lineParam); + else + gxLineBuilder(layer, lineParam); + addLayerToGlobeControl(lineParam.layerName); //this.DialogResult = DialogResult.OK; MessageBox.Show("入库完成!", "提示"); @@ -167,6 +163,33 @@ } } + bool getValidateResult(GSOLayer layer) + { + FieldValidate fieldValidate = FieldValidateFactory.Create(ValidateConfig.LoadConfig(), + getEnumValidateType()); + + if (fieldValidate.Validate(layer)) return true; + DateTime dt = DateTime.Now; + string logFilePath = Application.StartupPath + "\\log\\" + dt.Year + "\\" + dt.Year + dt.Month + + "\\" + dt.Year + dt.Month + dt.Day + ".txt"; + MessageBox.Show("选择的数据不符合数据规范,详情见日志" + logFilePath, "提示"); + return false; + } + + void lineBuilder(GSOLayer layer,LineParam lineParam) + { + ModelBuilder lineBuilder = new LineBuilder(datasource); + lineBuilder.build(layer, checkBoxAdd.Checked ? EnumUpdateMode.Append : EnumUpdateMode.Update, + checkBoxDeep.Checked ? EnumBuildMode.Depth : EnumBuildMode.Alititude, lineParam); + } + + void gxLineBuilder(GSOLayer layer, LineParam lineParam) + { + ModelBuilder lineBuilder = new GXBuilder(datasource); + lineBuilder.build(layer, checkBoxAdd.Checked ? EnumUpdateMode.Append : EnumUpdateMode.Update, + checkBoxDeep.Checked ? EnumBuildMode.Depth : EnumBuildMode.Alititude, lineParam); + } + private EnumValidateType getEnumValidateType() { if (comboBoxExWidth.Text != "") diff --git a/LSPipeline.csproj b/LSPipeline.csproj index 477d8ba..599b492 100644 --- a/LSPipeline.csproj +++ b/LSPipeline.csproj @@ -222,6 +222,7 @@ FrmUpdateLayerFieldValues.cs + Form @@ -243,6 +244,7 @@ + True diff --git a/LSPipeline.suo b/LSPipeline.suo index c930f27..92b5d7d 100644 --- a/LSPipeline.suo +++ b/LSPipeline.suo Binary files differ diff --git a/OracleUtils.cs b/OracleUtils.cs new file mode 100644 index 0000000..c79d316 --- /dev/null +++ b/OracleUtils.cs @@ -0,0 +1,1271 @@ +using System; +using System.Collections; +using System.Data; +using System.Data.OracleClient; + +namespace WorldGIS +{ + public abstract class OracleUtils + { + // Read the connection strings from the configuration file + //public static readonly string ConnectionString = System.Configuration.ConfigurationSettings.AppSettings["ConnectionString"]; + public static readonly string ConnectionString = @"Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=" + Utility.DBServer + + ")(PORT=1521))(CONNECT_DATA=(SID=" + Utility.Database + + ")));Persist Security Info=True;User Id=" + Utility.UserID + + "; Password=" + Utility.DBPassword + ""; + + //Create a hashtable for the parameter cached + private static Hashtable parmCache = Hashtable.Synchronized(new Hashtable()); + + #region private utility methods & constructors + + //Since this class provides only static methods, make the default constructor private to prevent + //instances from being created with "new SqlHelper()". + private OracleUtils() { } + + /// + /// This method is used to attach array of SqlParameters to a SqlCommand. + /// + /// This method will assign a value of DbNull to any parameter with a direction of + /// InputOutput and a value of null. + /// + /// This behavior will prevent default values from being used, but + /// this will be the less common case than an intended pure output parameter (derived as InputOutput) + /// where the user provided no input value. + /// + /// The command to which the parameters will be added + /// an array of SqlParameters tho be added to command + private static void AttachParameters(OracleCommand command, OracleParameter[] commandParameters) + { + foreach (OracleParameter p in commandParameters) + { + //check for derived output value with no value assigned + if ((p.Direction == ParameterDirection.InputOutput) && (p.Value == null)) + { + p.Value = DBNull.Value; + } + + command.Parameters.Add(p); + } + } + + /// + /// This method assigns an array of values to an array of SqlParameters. + /// + /// array of SqlParameters to be assigned values + /// array of objects holding the values to be assigned + private static void AssignParameterValues(OracleParameter[] commandParameters, object[] parameterValues) + { + if ((commandParameters == null) || (parameterValues == null)) + { + //do nothing if we get no data + return; + } + + // we must have the same number of values as we pave parameters to put them in + if (commandParameters.Length != parameterValues.Length) + { + throw new ArgumentException("Parameter count does not match Parameter Value count."); + } + + //iterate through the SqlParameters, assigning the values from the corresponding position in the + //value array + for (int i = 0, j = commandParameters.Length; i < j; i++) + { + commandParameters[i].Value = parameterValues[i]; + } + } + + /// + /// This method opens (if necessary) and assigns a connection, transaction, command type and parameters + /// to the provided command. + /// + /// the SqlCommand to be prepared + /// a valid OracleConnection, on which to execute this command + /// a valid OracleTransaction, or 'null' + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an array of SqlParameters to be associated with the command or 'null' if no parameters are required + private static void PrepareCommand(OracleCommand command, OracleConnection connection, OracleTransaction transaction, CommandType commandType, string commandText, OracleParameter[] commandParameters) + { + //if the provided connection is not open, we will open it + if (connection.State != ConnectionState.Open) + { + connection.Open(); + } + + //associate the connection with the command + command.Connection = connection; + + //set the command text (stored procedure name or SQL statement) + command.CommandText = commandText; + + //if we were provided a transaction, assign it. + if (transaction != null) + { + command.Transaction = transaction; + } + + //set the command type + command.CommandType = commandType; + + //attach the command parameters if they are provided + if (commandParameters != null) + { + AttachParameters(command, commandParameters); + } + } + + + #endregion private utility methods & constructors + + #region ExecuteNonQuery + + /// + /// Execute a SqlCommand (that returns no resultset and takes no parameters) against the database specified in + /// the connection string. + /// + /// + /// e.g.: + /// int result = ExecuteNonQuery(connString, CommandType.StoredProcedure, "PublishOrders"); + /// + /// a valid connection string for a OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an int representing the number of rows affected by the command + public static int ExecuteNonQuery(string connectionString, CommandType commandType, string commandText) + { + //pass through the call providing null for the set of SqlParameters + return ExecuteNonQuery(connectionString, commandType, commandText, null); + } + + /// + /// Execute a SqlCommand (that returns no resultset) against the database specified in the connection string + /// using the provided parameters. + /// + /// + /// e.g.: + /// int result = ExecuteNonQuery(connString, CommandType.StoredProcedure, "PublishOrders", new OracleParameter("@prodid", 24)); + /// + /// a valid connection string for a OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an array of SqlParamters used to execute the command + /// an int representing the number of rows affected by the command + public static int ExecuteNonQuery(string connectionString, CommandType commandType, string commandText, params OracleParameter[] commandParameters) + { + //create & open a OracleConnection, and dispose of it after we are done. + using (OracleConnection cn = new OracleConnection(connectionString)) + { + cn.Open(); + + //call the overload that takes a connection in place of the connection string + return ExecuteNonQuery(cn, commandType, commandText, commandParameters); + } + } + + /// + /// Execute a stored procedure via a SqlCommand (that returns no resultset) against the database specified in + /// the connection string using the provided parameter values. This method will query the database to discover the parameters for the + /// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. + /// + /// + /// This method provides no access to output parameters or the stored procedure's return value parameter. + /// + /// e.g.: + /// int result = ExecuteNonQuery(connString, "PublishOrders", 24, 36); + /// + /// a valid connection string for a OracleConnection + /// the name of the stored prcedure + /// an array of objects to be assigned as the input values of the stored procedure + /// an int representing the number of rows affected by the command + public static int ExecuteNonQuery(string connectionString, string spName, params object[] parameterValues) + { + //if we receive parameter values, we need to figure out where they go + if ((parameterValues != null) && (parameterValues.Length > 0)) + { + //pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache) + OracleParameter[] commandParameters = OracleHelperParameterCache.GetSpParameterSet(connectionString, spName); + + //assign the provided values to these parameters based on parameter order + AssignParameterValues(commandParameters, parameterValues); + + //call the overload that takes an array of SqlParameters + return ExecuteNonQuery(connectionString, CommandType.StoredProcedure, spName, commandParameters); + } + //otherwise we can just call the SP without params + return ExecuteNonQuery(connectionString, CommandType.StoredProcedure, spName); + } + + /// + /// Execute a SqlCommand (that returns no resultset and takes no parameters) against the provided OracleConnection. + /// + /// + /// e.g.: + /// int result = ExecuteNonQuery(conn, CommandType.StoredProcedure, "PublishOrders"); + /// + /// a valid OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an int representing the number of rows affected by the command + public static int ExecuteNonQuery(OracleConnection connection, CommandType commandType, string commandText) + { + //pass through the call providing null for the set of SqlParameters + return ExecuteNonQuery(connection, commandType, commandText, null); + } + + /// + /// Execute a SqlCommand (that returns no resultset) against the specified OracleConnection + /// using the provided parameters. + /// + /// + /// e.g.: + /// int result = ExecuteNonQuery(conn, CommandType.StoredProcedure, "PublishOrders", new OracleParameter("@prodid", 24)); + /// + /// a valid OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an array of SqlParamters used to execute the command + /// an int representing the number of rows affected by the command + public static int ExecuteNonQuery(OracleConnection connection, CommandType commandType, string commandText, params OracleParameter[] commandParameters) + { + //create a command and prepare it for execution + + OracleCommand cmd = new OracleCommand(); + PrepareCommand(cmd, connection, null, commandType, commandText, commandParameters); + + //finally, execute the command. + int retval = cmd.ExecuteNonQuery(); + + // detach the SqlParameters from the command object, so they can be used again. + cmd.Parameters.Clear(); + return retval; + } + + public static int ExecuteNonQueryWithTimeout(string connectionString, CommandType commandType, string commandText, int cmdTimeout) + { + //create a command and prepare it for execution + using (OracleConnection cn = new OracleConnection(connectionString)) + { + cn.Open(); + OracleCommand cmd = new OracleCommand(); + PrepareCommand(cmd, cn, null, commandType, commandText, null); + cmd.CommandTimeout = cmdTimeout; + //finally, execute the command. + int retval = cmd.ExecuteNonQuery(); + + // detach the SqlParameters from the command object, so they can be used again. + cmd.Parameters.Clear(); + return retval; + } + + } + /// + /// Execute a stored procedure via a SqlCommand (that returns no resultset) against the specified OracleConnection + /// using the provided parameter values. This method will query the database to discover the parameters for the + /// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. + /// + /// + /// This method provides no access to output parameters or the stored procedure's return value parameter. + /// + /// e.g.: + /// int result = ExecuteNonQuery(conn, "PublishOrders", 24, 36); + /// + /// a valid OracleConnection + /// the name of the stored procedure + /// an array of objects to be assigned as the input values of the stored procedure + /// an int representing the number of rows affected by the command + public static int ExecuteNonQuery(OracleConnection connection, string spName, params object[] parameterValues) + { + //if we receive parameter values, we need to figure out where they go + if ((parameterValues != null) && (parameterValues.Length > 0)) + { + //pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache) + OracleParameter[] commandParameters = OracleHelperParameterCache.GetSpParameterSet(connection.ConnectionString, spName); + + //assign the provided values to these parameters based on parameter order + AssignParameterValues(commandParameters, parameterValues); + + //call the overload that takes an array of SqlParameters + return ExecuteNonQuery(connection, CommandType.StoredProcedure, spName, commandParameters); + } + //otherwise we can just call the SP without params + return ExecuteNonQuery(connection, CommandType.StoredProcedure, spName); + } + + /// + /// Execute a SqlCommand (that returns no resultset and takes no parameters) against the provided OracleTransaction. + /// + /// + /// e.g.: + /// int result = ExecuteNonQuery(trans, CommandType.StoredProcedure, "PublishOrders"); + /// + /// a valid OracleTransaction + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an int representing the number of rows affected by the command + public static int ExecuteNonQuery(OracleTransaction transaction, CommandType commandType, string commandText) + { + //pass through the call providing null for the set of SqlParameters + return ExecuteNonQuery(transaction, commandType, commandText, null); + } + + /// + /// Execute a SqlCommand (that returns no resultset) against the specified OracleTransaction + /// using the provided parameters. + /// + /// + /// e.g.: + /// int result = ExecuteNonQuery(trans, CommandType.StoredProcedure, "GetOrders", new OracleParameter("@prodid", 24)); + /// + /// a valid OracleTransaction + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an array of SqlParamters used to execute the command + /// an int representing the number of rows affected by the command + public static int ExecuteNonQuery(OracleTransaction transaction, CommandType commandType, string commandText, params OracleParameter[] commandParameters) + { + //create a command and prepare it for execution + OracleCommand cmd = new OracleCommand(); + PrepareCommand(cmd, transaction.Connection, transaction, commandType, commandText, commandParameters); + + //finally, execute the command. + int retval = cmd.ExecuteNonQuery(); + + // detach the SqlParameters from the command object, so they can be used again. + cmd.Parameters.Clear(); + return retval; + } + + /// + /// Execute a stored procedure via a SqlCommand (that returns no resultset) against the specified + /// OracleTransaction using the provided parameter values. This method will query the database to discover the parameters for the + /// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. + /// + /// + /// This method provides no access to output parameters or the stored procedure's return value parameter. + /// + /// e.g.: + /// int result = ExecuteNonQuery(conn, trans, "PublishOrders", 24, 36); + /// + /// a valid OracleTransaction + /// the name of the stored procedure + /// an array of objects to be assigned as the input values of the stored procedure + /// an int representing the number of rows affected by the command + public static int ExecuteNonQuery(OracleTransaction transaction, string spName, params object[] parameterValues) + { + //if we receive parameter values, we need to figure out where they go + if ((parameterValues != null) && (parameterValues.Length > 0)) + { + //pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache) + OracleParameter[] commandParameters = OracleHelperParameterCache.GetSpParameterSet(transaction.Connection.ConnectionString, spName); + + //assign the provided values to these parameters based on parameter order + AssignParameterValues(commandParameters, parameterValues); + + //call the overload that takes an array of SqlParameters + return ExecuteNonQuery(transaction, CommandType.StoredProcedure, spName, commandParameters); + } + //otherwise we can just call the SP without params + return ExecuteNonQuery(transaction, CommandType.StoredProcedure, spName); + } + + + #endregion ExecuteNonQuery + + #region ExecuteDataSet + + /// + /// Execute a SqlCommand (that returns a resultset and takes no parameters) against the database specified in + /// the connection string. + /// + /// + /// e.g.: + /// DataSet ds = ExecuteDataset(connString, CommandType.StoredProcedure, "GetOrders"); + /// + /// a valid connection string for a OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// a dataset containing the resultset generated by the command + public static DataSet ExecuteDataset(string connectionString, CommandType commandType, string commandText) + { + //pass through the call providing null for the set of SqlParameters + return ExecuteDataset(connectionString, commandType, commandText, null); + } + + /// + /// Execute a SqlCommand (that returns a resultset) against the database specified in the connection string + /// using the provided parameters. + /// + /// + /// e.g.: + /// DataSet ds = ExecuteDataset(connString, CommandType.StoredProcedure, "GetOrders", new OracleParameter("@prodid", 24)); + /// + /// a valid connection string for a OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an array of SqlParamters used to execute the command + /// a dataset containing the resultset generated by the command + public static DataSet ExecuteDataset(string connectionString, CommandType commandType, string commandText, params OracleParameter[] commandParameters) + { + //create & open a OracleConnection, and dispose of it after we are done. + using (OracleConnection cn = new OracleConnection(connectionString)) + { + cn.Open(); + + //call the overload that takes a connection in place of the connection string + return ExecuteDataset(cn, commandType, commandText, commandParameters); + } + } + + /// + /// Execute a stored procedure via a SqlCommand (that returns a resultset) against the database specified in + /// the connection string using the provided parameter values. This method will query the database to discover the parameters for the + /// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. + /// + /// + /// This method provides no access to output parameters or the stored procedure's return value parameter. + /// + /// e.g.: + /// DataSet ds = ExecuteDataset(connString, "GetOrders", 24, 36); + /// + /// a valid connection string for a OracleConnection + /// the name of the stored procedure + /// an array of objects to be assigned as the input values of the stored procedure + /// a dataset containing the resultset generated by the command + public static DataSet ExecuteDataset(string connectionString, string spName, params object[] parameterValues) + { + //if we receive parameter values, we need to figure out where they go + if ((parameterValues != null) && (parameterValues.Length > 0)) + { + //pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache) + OracleParameter[] commandParameters = OracleHelperParameterCache.GetSpParameterSet(connectionString, spName); + + //assign the provided values to these parameters based on parameter order + AssignParameterValues(commandParameters, parameterValues); + + //call the overload that takes an array of SqlParameters + return ExecuteDataset(connectionString, CommandType.StoredProcedure, spName, commandParameters); + } + //otherwise we can just call the SP without params + return ExecuteDataset(connectionString, CommandType.StoredProcedure, spName); + } + + /// + /// Execute a SqlCommand (that returns a resultset and takes no parameters) against the provided OracleConnection. + /// + /// + /// e.g.: + /// DataSet ds = ExecuteDataset(conn, CommandType.StoredProcedure, "GetOrders"); + /// + /// a valid OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// a dataset containing the resultset generated by the command + public static DataSet ExecuteDataset(OracleConnection connection, CommandType commandType, string commandText) + { + //pass through the call providing null for the set of SqlParameters + return ExecuteDataset(connection, commandType, commandText, null); + } + + /// + /// Execute a SqlCommand (that returns a resultset) against the specified OracleConnection + /// using the provided parameters. + /// + /// + /// e.g.: + /// DataSet ds = ExecuteDataset(conn, CommandType.StoredProcedure, "GetOrders", new OracleParameter("@prodid", 24)); + /// + /// a valid OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an array of SqlParamters used to execute the command + /// a dataset containing the resultset generated by the command + public static DataSet ExecuteDataset(OracleConnection connection, CommandType commandType, string commandText, params OracleParameter[] commandParameters) + { + //create a command and prepare it for execution + OracleCommand cmd = new OracleCommand(); + PrepareCommand(cmd, connection, null, commandType, commandText, commandParameters); + + //create the DataAdapter & DataSet + OracleDataAdapter da = new OracleDataAdapter(cmd); + DataSet ds = new DataSet(); + + //fill the DataSet using default values for DataTable names, etc. + da.Fill(ds); + + // detach the SqlParameters from the command object, so they can be used again. + cmd.Parameters.Clear(); + + //return the dataset + return ds; + } + + /// + /// Execute a stored procedure via a SqlCommand (that returns a resultset) against the specified OracleConnection + /// using the provided parameter values. This method will query the database to discover the parameters for the + /// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. + /// + /// + /// This method provides no access to output parameters or the stored procedure's return value parameter. + /// + /// e.g.: + /// DataSet ds = ExecuteDataset(conn, "GetOrders", 24, 36); + /// + /// a valid OracleConnection + /// the name of the stored procedure + /// an array of objects to be assigned as the input values of the stored procedure + /// a dataset containing the resultset generated by the command + public static DataSet ExecuteDataset(OracleConnection connection, string spName, params object[] parameterValues) + { + //if we receive parameter values, we need to figure out where they go + if ((parameterValues != null) && (parameterValues.Length > 0)) + { + //pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache) + OracleParameter[] commandParameters = OracleHelperParameterCache.GetSpParameterSet(connection.ConnectionString, spName); + + //assign the provided values to these parameters based on parameter order + AssignParameterValues(commandParameters, parameterValues); + + //call the overload that takes an array of SqlParameters + return ExecuteDataset(connection, CommandType.StoredProcedure, spName, commandParameters); + } + //otherwise we can just call the SP without params + return ExecuteDataset(connection, CommandType.StoredProcedure, spName); + } + + /// + /// Execute a SqlCommand (that returns a resultset and takes no parameters) against the provided OracleTransaction. + /// + /// + /// e.g.: + /// DataSet ds = ExecuteDataset(trans, CommandType.StoredProcedure, "GetOrders"); + /// + /// a valid OracleTransaction + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// a dataset containing the resultset generated by the command + public static DataSet ExecuteDataset(OracleTransaction transaction, CommandType commandType, string commandText) + { + //pass through the call providing null for the set of SqlParameters + return ExecuteDataset(transaction, commandType, commandText, null); + } + + /// + /// Execute a SqlCommand (that returns a resultset) against the specified OracleTransaction + /// using the provided parameters. + /// + /// + /// e.g.: + /// DataSet ds = ExecuteDataset(trans, CommandType.StoredProcedure, "GetOrders", new OracleParameter("@prodid", 24)); + /// + /// a valid OracleTransaction + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an array of SqlParamters used to execute the command + /// a dataset containing the resultset generated by the command + public static DataSet ExecuteDataset(OracleTransaction transaction, CommandType commandType, string commandText, params OracleParameter[] commandParameters) + { + //create a command and prepare it for execution + OracleCommand cmd = new OracleCommand(); + PrepareCommand(cmd, transaction.Connection, transaction, commandType, commandText, commandParameters); + + //create the DataAdapter & DataSet + OracleDataAdapter da = new OracleDataAdapter(cmd); + DataSet ds = new DataSet(); + + //fill the DataSet using default values for DataTable names, etc. + da.Fill(ds); + + // detach the SqlParameters from the command object, so they can be used again. + cmd.Parameters.Clear(); + + //return the dataset + return ds; + } + + /// + /// Execute a stored procedure via a SqlCommand (that returns a resultset) against the specified + /// OracleTransaction using the provided parameter values. This method will query the database to discover the parameters for the + /// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. + /// + /// + /// This method provides no access to output parameters or the stored procedure's return value parameter. + /// + /// e.g.: + /// DataSet ds = ExecuteDataset(trans, "GetOrders", 24, 36); + /// + /// a valid OracleTransaction + /// the name of the stored procedure + /// an array of objects to be assigned as the input values of the stored procedure + /// a dataset containing the resultset generated by the command + public static DataSet ExecuteDataset(OracleTransaction transaction, string spName, params object[] parameterValues) + { + //if we receive parameter values, we need to figure out where they go + if ((parameterValues != null) && (parameterValues.Length > 0)) + { + //pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache) + OracleParameter[] commandParameters = OracleHelperParameterCache.GetSpParameterSet(transaction.Connection.ConnectionString, spName); + + //assign the provided values to these parameters based on parameter order + AssignParameterValues(commandParameters, parameterValues); + + //call the overload that takes an array of SqlParameters + return ExecuteDataset(transaction, CommandType.StoredProcedure, spName, commandParameters); + } + //otherwise we can just call the SP without params + return ExecuteDataset(transaction, CommandType.StoredProcedure, spName); + } + + #endregion ExecuteDataSet + + #region ExecuteReader + + /// + /// this enum is used to indicate whether the connection was provided by the caller, or created by SqlHelper, so that + /// we can set the appropriate CommandBehavior when calling ExecuteReader() + /// + private enum OracleConnectionOwnership + { + /// Connection is owned and managed by SqlHelper + Internal, + /// Connection is owned and managed by the caller + External + } + + /// + /// Create and prepare a SqlCommand, and call ExecuteReader with the appropriate CommandBehavior. + /// + /// + /// If we created and opened the connection, we want the connection to be closed when the DataReader is closed. + /// + /// If the caller provided the connection, we want to leave it to them to manage. + /// + /// a valid OracleConnection, on which to execute this command + /// a valid OracleTransaction, or 'null' + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an array of SqlParameters to be associated with the command or 'null' if no parameters are required + /// indicates whether the connection parameter was provided by the caller, or created by SqlHelper + /// SqlDataReader containing the results of the command + private static OracleDataReader ExecuteReader(OracleConnection connection, OracleTransaction transaction, CommandType commandType, string commandText, OracleParameter[] commandParameters, OracleConnectionOwnership connectionOwnership) + { + //create a command and prepare it for execution + OracleCommand cmd = new OracleCommand(); + PrepareCommand(cmd, connection, transaction, commandType, commandText, commandParameters); + + //create a reader + OracleDataReader dr; + + // call ExecuteReader with the appropriate CommandBehavior + if (connectionOwnership == OracleConnectionOwnership.External) + { + dr = cmd.ExecuteReader(); + } + else + { + dr = cmd.ExecuteReader(CommandBehavior.CloseConnection); + + } + + // detach the SqlParameters from the command object, so they can be used again. + cmd.Parameters.Clear(); + + return dr; + } + + /// + /// Execute a SqlCommand (that returns a resultset and takes no parameters) against the database specified in + /// the connection string. + /// + /// + /// e.g.: + /// SqlDataReader dr = ExecuteReader(connString, CommandType.StoredProcedure, "GetOrders"); + /// + /// a valid connection string for a OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// a SqlDataReader containing the resultset generated by the command + public static OracleDataReader ExecuteReader(string connectionString, CommandType commandType, string commandText) + { + //pass through the call providing null for the set of SqlParameters + return ExecuteReader(connectionString, commandType, commandText, null); + } + + /// + /// Execute a SqlCommand (that returns a resultset) against the database specified in the connection string + /// using the provided parameters. + /// + /// + /// e.g.: + /// SqlDataReader dr = ExecuteReader(connString, CommandType.StoredProcedure, "GetOrders", new OracleParameter("@prodid", 24)); + /// + /// a valid connection string for a OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an array of SqlParamters used to execute the command + /// a SqlDataReader containing the resultset generated by the command + public static OracleDataReader ExecuteReader(string connectionString, CommandType commandType, string commandText, params OracleParameter[] commandParameters) + { + //create & open a OracleConnection + OracleConnection cn = new OracleConnection(connectionString); + cn.Open(); + + try + { + //call the private overload that takes an internally owned connection in place of the connection string + return ExecuteReader(cn, null, commandType, commandText, commandParameters, OracleConnectionOwnership.Internal); + } + catch + { + //if we fail to return the SqlDatReader, we need to close the connection ourselves + cn.Close(); + throw; + } + } + + /// + /// Execute a stored procedure via a SqlCommand (that returns a resultset) against the database specified in + /// the connection string using the provided parameter values. This method will query the database to discover the parameters for the + /// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. + /// + /// + /// This method provides no access to output parameters or the stored procedure's return value parameter. + /// + /// e.g.: + /// SqlDataReader dr = ExecuteReader(connString, "GetOrders", 24, 36); + /// + /// a valid connection string for a OracleConnection + /// the name of the stored procedure + /// an array of objects to be assigned as the input values of the stored procedure + /// a SqlDataReader containing the resultset generated by the command + public static OracleDataReader ExecuteReader(string connectionString, string spName, params object[] parameterValues) + { + //if we receive parameter values, we need to figure out where they go + if ((parameterValues != null) && (parameterValues.Length > 0)) + { + //pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache) + OracleParameter[] commandParameters = OracleHelperParameterCache.GetSpParameterSet(connectionString, spName); + + //assign the provided values to these parameters based on parameter order + AssignParameterValues(commandParameters, parameterValues); + + //call the overload that takes an array of SqlParameters + return ExecuteReader(connectionString, CommandType.StoredProcedure, spName, commandParameters); + } + //otherwise we can just call the SP without params + return ExecuteReader(connectionString, CommandType.StoredProcedure, spName); + } + + /// + /// Execute a SqlCommand (that returns a resultset and takes no parameters) against the provided OracleConnection. + /// + /// + /// e.g.: + /// SqlDataReader dr = ExecuteReader(conn, CommandType.StoredProcedure, "GetOrders"); + /// + /// a valid OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// a SqlDataReader containing the resultset generated by the command + public static OracleDataReader ExecuteReader(OracleConnection connection, CommandType commandType, string commandText) + { + //pass through the call providing null for the set of SqlParameters + return ExecuteReader(connection, commandType, commandText, null); + } + + /// + /// Execute a SqlCommand (that returns a resultset) against the specified OracleConnection + /// using the provided parameters. + /// + /// + /// e.g.: + /// SqlDataReader dr = ExecuteReader(conn, CommandType.StoredProcedure, "GetOrders", new OracleParameter("@prodid", 24)); + /// + /// a valid OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an array of SqlParamters used to execute the command + /// a SqlDataReader containing the resultset generated by the command + public static OracleDataReader ExecuteReader(OracleConnection connection, CommandType commandType, string commandText, params OracleParameter[] commandParameters) + { + //pass through the call to the private overload using a null transaction value and an externally owned connection + return ExecuteReader(connection, null, commandType, commandText, commandParameters, OracleConnectionOwnership.External); + } + + /// + /// Execute a stored procedure via a SqlCommand (that returns a resultset) against the specified OracleConnection + /// using the provided parameter values. This method will query the database to discover the parameters for the + /// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. + /// + /// + /// This method provides no access to output parameters or the stored procedure's return value parameter. + /// + /// e.g.: + /// SqlDataReader dr = ExecuteReader(conn, "GetOrders", 24, 36); + /// + /// a valid OracleConnection + /// the name of the stored procedure + /// an array of objects to be assigned as the input values of the stored procedure + /// a SqlDataReader containing the resultset generated by the command + public static OracleDataReader ExecuteReader(OracleConnection connection, string spName, params object[] parameterValues) + { + //if we receive parameter values, we need to figure out where they go + if ((parameterValues != null) && (parameterValues.Length > 0)) + { + OracleParameter[] commandParameters = OracleHelperParameterCache.GetSpParameterSet(connection.ConnectionString, spName); + + AssignParameterValues(commandParameters, parameterValues); + + return ExecuteReader(connection, CommandType.StoredProcedure, spName, commandParameters); + } + //otherwise we can just call the SP without params + return ExecuteReader(connection, CommandType.StoredProcedure, spName); + } + + /// + /// Execute a SqlCommand (that returns a resultset and takes no parameters) against the provided OracleTransaction. + /// + /// + /// e.g.: + /// SqlDataReader dr = ExecuteReader(trans, CommandType.StoredProcedure, "GetOrders"); + /// + /// a valid OracleTransaction + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// a SqlDataReader containing the resultset generated by the command + public static OracleDataReader ExecuteReader(OracleTransaction transaction, CommandType commandType, string commandText) + { + //pass through the call providing null for the set of SqlParameters + return ExecuteReader(transaction, commandType, commandText, null); + } + + /// + /// Execute a SqlCommand (that returns a resultset) against the specified OracleTransaction + /// using the provided parameters. + /// + /// + /// e.g.: + /// SqlDataReader dr = ExecuteReader(trans, CommandType.StoredProcedure, "GetOrders", new OracleParameter("@prodid", 24)); + /// + /// a valid OracleTransaction + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an array of SqlParamters used to execute the command + /// a SqlDataReader containing the resultset generated by the command + public static OracleDataReader ExecuteReader(OracleTransaction transaction, CommandType commandType, string commandText, params OracleParameter[] commandParameters) + { + //pass through to private overload, indicating that the connection is owned by the caller + return ExecuteReader(transaction.Connection, transaction, commandType, commandText, commandParameters, OracleConnectionOwnership.External); + } + + /// + /// Execute a stored procedure via a SqlCommand (that returns a resultset) against the specified + /// OracleTransaction using the provided parameter values. This method will query the database to discover the parameters for the + /// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. + /// + /// + /// This method provides no access to output parameters or the stored procedure's return value parameter. + /// + /// e.g.: + /// SqlDataReader dr = ExecuteReader(trans, "GetOrders", 24, 36); + /// + /// a valid OracleTransaction + /// the name of the stored procedure + /// an array of objects to be assigned as the input values of the stored procedure + /// a SqlDataReader containing the resultset generated by the command + public static OracleDataReader ExecuteReader(OracleTransaction transaction, string spName, params object[] parameterValues) + { + //if we receive parameter values, we need to figure out where they go + if ((parameterValues != null) && (parameterValues.Length > 0)) + { + OracleParameter[] commandParameters = OracleHelperParameterCache.GetSpParameterSet(transaction.Connection.ConnectionString, spName); + + AssignParameterValues(commandParameters, parameterValues); + + return ExecuteReader(transaction, CommandType.StoredProcedure, spName, commandParameters); + } + //otherwise we can just call the SP without params + return ExecuteReader(transaction, CommandType.StoredProcedure, spName); + } + + #endregion ExecuteReader + + #region ExecuteScalar + + /// + /// Execute a OracleCommand (that returns a 1x1 resultset and takes no parameters) against the database specified in + /// the connection string. + /// + /// + /// e.g.: + /// int orderCount = (int)ExecuteScalar(connString, CommandType.StoredProcedure, "GetOrderCount"); + /// + /// a valid connection string for a OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an object containing the value in the 1x1 resultset generated by the command + public static object ExecuteScalar(string connectionString, CommandType commandType, string commandText) + { + //pass through the call providing null for the set of SqlParameters + return ExecuteScalar(connectionString, commandType, commandText, null); + } + + /// + /// Execute a OracleCommand (that returns a 1x1 resultset) against the database specified in the connection string + /// using the provided parameters. + /// + /// + /// e.g.: + /// int orderCount = (int)ExecuteScalar(connString, CommandType.StoredProcedure, "GetOrderCount", new OracleParameter("@prodid", 24)); + /// + /// a valid connection string for a OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an array of SqlParamters used to execute the command + /// an object containing the value in the 1x1 resultset generated by the command + public static object ExecuteScalar(string connectionString, CommandType commandType, string commandText, params OracleParameter[] commandParameters) + { + //create & open a OracleConnection, and dispose of it after we are done. + using (OracleConnection cn = new OracleConnection(connectionString)) + { + cn.Open(); + + //call the overload that takes a connection in place of the connection string + return ExecuteScalar(cn, commandType, commandText, commandParameters); + } + } + + /// + /// Execute a stored procedure via a OracleCommand (that returns a 1x1 resultset) against the database specified in + /// the connection string using the provided parameter values. This method will query the database to discover the parameters for the + /// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. + /// + /// + /// This method provides no access to output parameters or the stored procedure's return value parameter. + /// + /// e.g.: + /// int orderCount = (int)ExecuteScalar(connString, "GetOrderCount", 24, 36); + /// + /// a valid connection string for a OracleConnection + /// the name of the stored procedure + /// an array of objects to be assigned as the input values of the stored procedure + /// an object containing the value in the 1x1 resultset generated by the command + public static object ExecuteScalar(string connectionString, string spName, params object[] parameterValues) + { + //if we receive parameter values, we need to figure out where they go + if ((parameterValues != null) && (parameterValues.Length > 0)) + { + //pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache) + OracleParameter[] commandParameters = OracleHelperParameterCache.GetSpParameterSet(connectionString, spName); + + //assign the provided values to these parameters based on parameter order + AssignParameterValues(commandParameters, parameterValues); + + //call the overload that takes an array of SqlParameters + return ExecuteScalar(connectionString, CommandType.StoredProcedure, spName, commandParameters); + } + //otherwise we can just call the SP without params + return ExecuteScalar(connectionString, CommandType.StoredProcedure, spName); + } + + /// + /// Execute a OracleCommand (that returns a 1x1 resultset and takes no parameters) against the provided OracleConnection. + /// + /// + /// e.g.: + /// int orderCount = (int)ExecuteScalar(conn, CommandType.StoredProcedure, "GetOrderCount"); + /// + /// a valid OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an object containing the value in the 1x1 resultset generated by the command + public static object ExecuteScalar(OracleConnection connection, CommandType commandType, string commandText) + { + //pass through the call providing null for the set of SqlParameters + return ExecuteScalar(connection, commandType, commandText, null); + } + + /// + /// Execute a OracleCommand (that returns a 1x1 resultset) against the specified OracleConnection + /// using the provided parameters. + /// + /// + /// e.g.: + /// int orderCount = (int)ExecuteScalar(conn, CommandType.StoredProcedure, "GetOrderCount", new OracleParameter("@prodid", 24)); + /// + /// a valid OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an array of SqlParamters used to execute the command + /// an object containing the value in the 1x1 resultset generated by the command + public static object ExecuteScalar(OracleConnection connection, CommandType commandType, string commandText, params OracleParameter[] commandParameters) + { + //create a command and prepare it for execution + OracleCommand cmd = new OracleCommand(); + PrepareCommand(cmd, connection, null, commandType, commandText, commandParameters); + + //execute the command & return the results + object retval = cmd.ExecuteScalar(); + + // detach the SqlParameters from the command object, so they can be used again. + cmd.Parameters.Clear(); + return retval; + + } + + /// + /// Execute a stored procedure via a OracleCommand (that returns a 1x1 resultset) against the specified OracleConnection + /// using the provided parameter values. This method will query the database to discover the parameters for the + /// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. + /// + /// + /// This method provides no access to output parameters or the stored procedure's return value parameter. + /// + /// e.g.: + /// int orderCount = (int)ExecuteScalar(conn, "GetOrderCount", 24, 36); + /// + /// a valid OracleConnection + /// the name of the stored procedure + /// an array of objects to be assigned as the input values of the stored procedure + /// an object containing the value in the 1x1 resultset generated by the command + public static object ExecuteScalar(OracleConnection connection, string spName, params object[] parameterValues) + { + //if we receive parameter values, we need to figure out where they go + if ((parameterValues != null) && (parameterValues.Length > 0)) + { + //pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache) + OracleParameter[] commandParameters = OracleHelperParameterCache.GetSpParameterSet(connection.ConnectionString, spName); + + //assign the provided values to these parameters based on parameter order + AssignParameterValues(commandParameters, parameterValues); + + //call the overload that takes an array of SqlParameters + return ExecuteScalar(connection, CommandType.StoredProcedure, spName, commandParameters); + } + //otherwise we can just call the SP without params + return ExecuteScalar(connection, CommandType.StoredProcedure, spName); + } + + /// + /// Execute a OracleCommand (that returns a 1x1 resultset and takes no parameters) against the provided OracleTransaction. + /// + /// + /// e.g.: + /// int orderCount = (int)ExecuteScalar(trans, CommandType.StoredProcedure, "GetOrderCount"); + /// + /// a valid OracleTransaction + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an object containing the value in the 1x1 resultset generated by the command + public static object ExecuteScalar(OracleTransaction transaction, CommandType commandType, string commandText) + { + //pass through the call providing null for the set of SqlParameters + return ExecuteScalar(transaction, commandType, commandText, null); + } + + /// + /// Execute a OracleCommand (that returns a 1x1 resultset) against the specified OracleTransaction + /// using the provided parameters. + /// + /// + /// e.g.: + /// int orderCount = (int)ExecuteScalar(trans, CommandType.StoredProcedure, "GetOrderCount", new OracleParameter("@prodid", 24)); + /// + /// a valid OracleTransaction + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an array of SqlParamters used to execute the command + /// an object containing the value in the 1x1 resultset generated by the command + public static object ExecuteScalar(OracleTransaction transaction, CommandType commandType, string commandText, params OracleParameter[] commandParameters) + { + //create a command and prepare it for execution + OracleCommand cmd = new OracleCommand(); + PrepareCommand(cmd, transaction.Connection, transaction, commandType, commandText, commandParameters); + + //execute the command & return the results + object retval = cmd.ExecuteScalar(); + + // detach the SqlParameters from the command object, so they can be used again. + cmd.Parameters.Clear(); + return retval; + } + + /// + /// Execute a stored procedure via a OracleCommand (that returns a 1x1 resultset) against the specified + /// OracleTransaction using the provided parameter values. This method will query the database to discover the parameters for the + /// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. + /// + /// + /// This method provides no access to output parameters or the stored procedure's return value parameter. + /// + /// e.g.: + /// int orderCount = (int)ExecuteScalar(trans, "GetOrderCount", 24, 36); + /// + /// a valid OracleTransaction + /// the name of the stored procedure + /// an array of objects to be assigned as the input values of the stored procedure + /// an object containing the value in the 1x1 resultset generated by the command + public static object ExecuteScalar(OracleTransaction transaction, string spName, params object[] parameterValues) + { + //if we receive parameter values, we need to figure out where they go + if ((parameterValues != null) && (parameterValues.Length > 0)) + { + //pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache) + OracleParameter[] commandParameters = OracleHelperParameterCache.GetSpParameterSet(transaction.Connection.ConnectionString, spName); + + //assign the provided values to these parameters based on parameter order + AssignParameterValues(commandParameters, parameterValues); + + //call the overload that takes an array of SqlParameters + return ExecuteScalar(transaction, CommandType.StoredProcedure, spName, commandParameters); + } + //otherwise we can just call the SP without params + return ExecuteScalar(transaction, CommandType.StoredProcedure, spName); + } + + #endregion ExecuteScalar + + + } + /// + /// OracleHelperParameterCache provides functions to leverage a static cache of procedure parameters, and the + /// ability to discover parameters for stored procedures at run-time. + /// + /// + + public sealed class OracleHelperParameterCache + { + #region private methods, variables, and constructors + + //Since this class provides only static methods, make the default constructor private to prevent + //instances from being created with "new SqlHelperParameterCache()". + private OracleHelperParameterCache() { } + + private static Hashtable paramCache = Hashtable.Synchronized(new Hashtable()); + + /// + /// resolve at run time the appropriate set of SqlParameters for a stored procedure + /// + /// a valid connection string for a OracleConnection + /// the name of the stored procedure + /// whether or not to include their return value parameter + /// + private static OracleParameter[] DiscoverSpParameterSet(string connectionString, string spName, bool includeReturnValueParameter) + { + using (OracleConnection cn = new OracleConnection(connectionString)) + using (OracleCommand cmd = new OracleCommand(spName, cn)) + { + cn.Open(); + cmd.CommandType = CommandType.StoredProcedure; + OracleCommandBuilder.DeriveParameters(cmd); + + if (!includeReturnValueParameter) + { + cmd.Parameters.RemoveAt(0); + } + + OracleParameter[] discoveredParameters = new OracleParameter[cmd.Parameters.Count]; ; + + cmd.Parameters.CopyTo(discoveredParameters, 0); + + return discoveredParameters; + } + } + + //deep copy of cached OracleParameter array + private static OracleParameter[] CloneParameters(OracleParameter[] originalParameters) + { + OracleParameter[] clonedParameters = new OracleParameter[originalParameters.Length]; + + for (int i = 0, j = originalParameters.Length; i < j; i++) + { + clonedParameters[i] = (OracleParameter)((ICloneable)originalParameters[i]).Clone(); + } + + return clonedParameters; + } + + #endregion private methods, variables, and constructors + + #region caching functions + + /// + /// add parameter array to the cache + /// + /// a valid connection string for a OracleConnection + /// the stored procedure name or T-SQL command + /// an array of SqlParamters to be cached + public static void CacheParameterSet(string connectionString, string commandText, params OracleParameter[] commandParameters) + { + string hashKey = connectionString + ":" + commandText; + + paramCache[hashKey] = commandParameters; + } + + /// + /// retrieve a parameter array from the cache + /// + /// a valid connection string for a OracleConnection + /// the stored procedure name or T-SQL command + /// an array of SqlParamters + public static OracleParameter[] GetCachedParameterSet(string connectionString, string commandText) + { + string hashKey = connectionString + ":" + commandText; + + OracleParameter[] cachedParameters = (OracleParameter[])paramCache[hashKey]; + + if (cachedParameters == null) + { + return null; + } + return CloneParameters(cachedParameters); + } + + #endregion caching functions + + #region Parameter Discovery Functions + + /// + /// Retrieves the set of SqlParameters appropriate for the stored procedure + /// + /// + /// This method will query the database for this information, and then store it in a cache for future requests. + /// + /// a valid connection string for a OracleConnection + /// the name of the stored procedure + /// an array of SqlParameters + public static OracleParameter[] GetSpParameterSet(string connectionString, string spName) + { + return GetSpParameterSet(connectionString, spName, false); + } + + /// + /// Retrieves the set of SqlParameters appropriate for the stored procedure + /// + /// + /// This method will query the database for this information, and then store it in a cache for future requests. + /// + /// a valid connection string for a OracleConnection + /// the name of the stored procedure + /// a bool value indicating whether the return value parameter should be included in the results + /// an array of SqlParameters + public static OracleParameter[] GetSpParameterSet(string connectionString, string spName, bool includeReturnValueParameter) + { + string hashKey = connectionString + ":" + spName + (includeReturnValueParameter ? ":include ReturnValue Parameter" : ""); + + OracleParameter[] cachedParameters; + + cachedParameters = (OracleParameter[])paramCache[hashKey]; + + if (cachedParameters == null) + { + cachedParameters = (OracleParameter[])(paramCache[hashKey] = DiscoverSpParameterSet(connectionString, spName, includeReturnValueParameter)); + } + + return CloneParameters(cachedParameters); + } + + #endregion Parameter Discovery Functions + } +} diff --git a/Utility.cs b/Utility.cs index 1429fd9..4e64d66 100644 --- a/Utility.cs +++ b/Utility.cs @@ -17,6 +17,11 @@ { public class Utility { + public static string DBServer; + public static string Database; + public static string UserID; + public static string DBPassword; + public static void SetBallons(GSOBalloon featureTooltip,GSOBalloonEx balloonEx) { featureTooltip.CacheFilePath = Path.GetDirectoryName(Application.ExecutablePath) + "/GeoScene/Globe/Temp"; diff --git a/bin/x64/Debug/LSPipeline.exe b/bin/x64/Debug/LSPipeline.exe index 833a5e5..76f838b 100644 --- a/bin/x64/Debug/LSPipeline.exe +++ b/bin/x64/Debug/LSPipeline.exe Binary files differ diff --git a/bin/x64/Debug/LSPipeline.pdb b/bin/x64/Debug/LSPipeline.pdb index 245e727..28c81dc 100644 --- a/bin/x64/Debug/LSPipeline.pdb +++ b/bin/x64/Debug/LSPipeline.pdb Binary files differ diff --git a/bin/x64/Debug/databaseConfigOracle.xml b/bin/x64/Debug/databaseConfigOracle.xml index 7e48b08..94be70c 100644 --- a/bin/x64/Debug/databaseConfigOracle.xml +++ b/bin/x64/Debug/databaseConfigOracle.xml @@ -2,7 +2,7 @@ True 192.168.0.203 - szhtdb2 - release - release + eydb2 + scott + scott \ No newline at end of file diff --git a/bin/x64/Debug/log.txt b/bin/x64/Debug/log.txt index 5236cc6..73bcf38 100644 --- a/bin/x64/Debug/log.txt +++ b/bin/x64/Debug/log.txt @@ -27704,3 +27704,75 @@ exception over ------------------------------------------------------------ + + exception begin -----------------2016/12/2 9:55:40--------------------- + + + + e.Message:输入字符串的格式不正确。 + + e.Source:mscorlib + + e.TargetSite:Double ParseDouble(System.String, System.Globalization.NumberStyles, System.Globalization.NumberFormatInfo) + + e.StackTrace: 在 System.Number.ParseDouble(String value, NumberStyles options, NumberFormatInfo numfmt) + 在 System.Double.Parse(String s, IFormatProvider provider) + 在 WorldGIS.CtrlEntitySpaceInfo.positionChanged() 位置 D:\LSPipeline\UserControls\CtrlEntitySpaceInfo.cs:行号 113 + + + + exception over ------------------------------------------------------------ + + exception begin -----------------2016/12/2 9:55:41--------------------- + + + + e.Message:输入字符串的格式不正确。 + + e.Source:mscorlib + + e.TargetSite:Double ParseDouble(System.String, System.Globalization.NumberStyles, System.Globalization.NumberFormatInfo) + + e.StackTrace: 在 System.Number.ParseDouble(String value, NumberStyles options, NumberFormatInfo numfmt) + 在 System.Double.Parse(String s, IFormatProvider provider) + 在 WorldGIS.CtrlEntitySpaceInfo.positionChanged() 位置 D:\LSPipeline\UserControls\CtrlEntitySpaceInfo.cs:行号 115 + + + + exception over ------------------------------------------------------------ + + exception begin -----------------2016/12/2 9:55:55--------------------- + + + + e.Message:输入字符串的格式不正确。 + + e.Source:mscorlib + + e.TargetSite:Double ParseDouble(System.String, System.Globalization.NumberStyles, System.Globalization.NumberFormatInfo) + + e.StackTrace: 在 System.Number.ParseDouble(String value, NumberStyles options, NumberFormatInfo numfmt) + 在 System.Double.Parse(String s, IFormatProvider provider) + 在 WorldGIS.CtrlEntitySpaceInfo.positionChanged() 位置 D:\LSPipeline\UserControls\CtrlEntitySpaceInfo.cs:行号 113 + + + + exception over ------------------------------------------------------------ + + exception begin -----------------2016/12/2 9:55:56--------------------- + + + + e.Message:输入字符串的格式不正确。 + + e.Source:mscorlib + + e.TargetSite:Double ParseDouble(System.String, System.Globalization.NumberStyles, System.Globalization.NumberFormatInfo) + + e.StackTrace: 在 System.Number.ParseDouble(String value, NumberStyles options, NumberFormatInfo numfmt) + 在 System.Double.Parse(String s, IFormatProvider provider) + 在 WorldGIS.CtrlEntitySpaceInfo.positionChanged() 位置 D:\LSPipeline\UserControls\CtrlEntitySpaceInfo.cs:行号 115 + + + + exception over ------------------------------------------------------------ diff --git a/obj/Debug/GenerateResource.read.1.tlog b/obj/Debug/GenerateResource.read.1.tlog index b4c2526..95a0a19 100644 --- a/obj/Debug/GenerateResource.read.1.tlog +++ b/obj/Debug/GenerateResource.read.1.tlog Binary files differ diff --git a/obj/Debug/LSPipeline.exe b/obj/Debug/LSPipeline.exe index 833a5e5..76f838b 100644 --- a/obj/Debug/LSPipeline.exe +++ b/obj/Debug/LSPipeline.exe Binary files differ diff --git a/FrmDatabaseParaSettingOracle.cs b/FrmDatabaseParaSettingOracle.cs index 18c5e99..6e97dfb 100644 --- a/FrmDatabaseParaSettingOracle.cs +++ b/FrmDatabaseParaSettingOracle.cs @@ -47,12 +47,15 @@ } string serverIp = textBoxIP.Text.Trim(); + /* string hostName = System.Net.Dns.GetHostName(); if (serverIp == hostName || serverIp == "localhost" || serverIp == System.Net.Dns.GetHostAddresses(hostName).GetValue(2).ToString()) { serverIp = "127.0.0.1"; } + * */ + DateTime timeStart = DateTime.Now; GSODataSource ds = globeControl1.Globe.DataManager.GetDataSourceByName(serverIp + "/" + textBoxDatabase.Text.Trim() + "_" + textBoxUser.Text.Trim()); if (ds == null) @@ -83,7 +86,7 @@ connectParams.dataSourceName = ds.Name; connectParams.databaseType = EnumDataSourceType.Oracle; Utility.connectParamsOfDatabase.Add(connectParams); - + setUtilityValue(connectParams); WriteXML(); MessageBox.Show("连接Oracle数据库成功,用时:" + secondsConnectOracle.ToString() + "秒", "提示"); } @@ -92,6 +95,14 @@ this.Close(); } + private void setUtilityValue(DatabaseConnectParams connectParams) + { + Utility.DBServer = connectParams.ip; + Utility.Database = connectParams.databaseName; + Utility.UserID = connectParams.userName; + Utility.DBPassword = connectParams.password; + } + private void ReadXML() { string strFileName = Path.GetDirectoryName(Application.ExecutablePath) + "/databaseConfigOracle.xml"; diff --git a/GXBuilder.cs b/GXBuilder.cs new file mode 100644 index 0000000..b2ec9b2 --- /dev/null +++ b/GXBuilder.cs @@ -0,0 +1,187 @@ +using System; +using System.Data; +using System.Drawing; +using System.Runtime.InteropServices; +using GeoScene.Data; +using GeoScene.Engine; +using GeoScene.Globe; + +namespace WorldGIS +{ + public class GXBuilder : ModelBuilder + { + private static double diameter = 0.1; + + public GXBuilder(GSODataSource ds) + : base(ds) + { + + } + + public override bool validate(GSOLayer layer) + { + return true; + } + + /// + /// + /// + /// 追加或修改 + /// 高程入库或埋深入库 + /// + public override bool doBuild(EnumUpdateMode updateMode, + EnumBuildMode buildMode, + BaseParam param) + { + LineParam lineParam = param as LineParam; + GSOFeatureDataset newFeatureSet = ds.GetDatasetByName(lineParam.layerName) as GSOFeatureDataset; + if (newFeatureSet == null) + { + newFeatureSet = CreateDBFeatureDataset(layer, lineParam.layerName); + } + newFeatureSet.Open(); + GSOFeatures features = layer.GetAllFeatures(true); + for (int i = 0; i < features.Length; i++) + { + GSOFeature f = features[i]; + GSOGeoPolyline3D lineeee = f.Geometry as GSOGeoPolyline3D; + if (lineeee == null || lineeee.GetSpaceLength(true, 6378137) == 0) + { + LogHelper.Error("出现数据无法入库:" + f.ID); + continue; + } + + GSOFeature newFeature = newFeatureSet.CreateFeature(); + + double radius = diameter; //创建光纤的半径 + newFeature.Geometry = updateGemotry(f, lineParam, radius, buildMode); + newFeature.Geometry.Style = getPipeLineStyle(lineParam, f, radius); + newFeature.Name = f.GetFieldAsString(lineParam.uniqueIdFieldName); + setFeatureValueByShapeFeature(f, newFeature); + // newFeatureSet + if (newFeatureSet.GetFeatureByName(newFeature.Name, true).Length > 0) + { + if (!this.UpdateGXDevice(newFeatureSet.GetFeatureByName(newFeature.Name, true)[0], + newFeature)) + { + LogHelper.Error("光纤设备更新失败:" + newFeature.Name+"\r\n"); + } + continue; + } + newFeatureSet.AddFeature(newFeature); + if (!AddGXDevice(newFeature)) + { + LogHelper.Error("光纤数据保存Alarm_Device失败:" + newFeature.Name+"\r\n"); + } + } + newFeatureSet.Save(); + newFeatureSet.Close(); + return true; + } + + private bool AddGXDevice(GSOFeature feature) + { + //保存数据到设备表 + try + { + String deviceType = feature.GetValue("DEVICETYPE") == null + ? "" : feature.GetValue("DEVICETYPE").ToString(); + String devCode = feature.GetValue("DEVICEID") == null + ? "" : feature.GetValue("DEVICEID").ToString(); + String road = feature.GetValue("ROAD") == null + ? "" : feature.GetValue("ROAD").ToString(); + + //TODO LIST: + string sqlCount = "select dbid from alarm_device_type where" + + " typename = '" + deviceType + "'"; + object dbid = OracleUtils.ExecuteScalar(OracleUtils.ConnectionString, + CommandType.Text, sqlCount); + if (dbid == null) + { + return false; + } + int deviceTypeId = int.Parse(dbid.ToString()); + string sql = "Insert into alarm_device (DBID,ACTIVE,DEVCODE,DEVNAME,FACTORY," + + "INSTALLDATE,GAOCHENG,HEIGHT,LATITUDE,LONGTITUDE,DEVICETYPE_ID) " + + "values (SEQ_DEVICE_ID.NEXTVAL, 1, '" + devCode + "', '" + deviceType + devCode + + "', " + "'航天二院', " + "to_date('" + DateTime.Now.ToString() + "','yyyy/MM/dd hh24:mi::ss'), " + + "0, 0, 0, 0, " + deviceTypeId + ")"; + OracleUtils.ExecuteNonQuery(OracleUtils.ConnectionString, CommandType.Text, sql); + + } + catch (Exception e) + { + throw; + } + return true; + } + + private bool UpdateGXDevice(GSOFeature feature, GSOFeature newFeature) + { + String deviceType = newFeature.GetValue("DEVICETYPE") == null + ? "" : newFeature.GetValue("DEVICETYPE").ToString(); + String devCode = newFeature.GetValue("DEVICEID") == null + ? "" : newFeature.GetValue("DEVICEID").ToString(); + String road = newFeature.GetValue("ROAD") == null + ? "" : newFeature.GetValue("ROAD").ToString(); + + feature.Geometry = newFeature.Geometry.Clone(); + this.setFeatureValueByShapeFeature(newFeature,feature); + // feature.Dataset.Save(); + + string sqlCount = "select dbid from alarm_device_type where" + + " typename = '" + deviceType + "'"; + object dbid = OracleUtils.ExecuteScalar(OracleUtils.ConnectionString, + CommandType.Text, sqlCount); + if (dbid == null) + { + return false; + } + int deviceTypeId = int.Parse(dbid.ToString()); + + string sql = "update alarm_device set FACTORY='" + road + + "', DEVICETYPE_ID='" + deviceTypeId + + "', DEVNAME='"+deviceType+devCode+"' "+ + "where devcode='" + devCode + "'"; + OracleUtils.ExecuteNonQuery(OracleUtils.ConnectionString, CommandType.Text, sql); + return true; + } + + private GSOLineStyle3D getPipeLineStyle(LineParam lineParam, GSOFeature f, double radius) + { + GSOPipeLineStyle3D style0 = new GSOPipeLineStyle3D(); + style0.LineColor = Color.FromArgb(lineParam.transparency, lineParam.lineColor); + style0.Slice = lineParam.sliceNum; + style0.CornerSliceAngle = lineParam.cornerSliceAngle; + style0.Radius = radius; + return style0; + } + + private GSOGeometry updateGemotry(GSOFeature f, LineParam lineParam, double radius, EnumBuildMode buildMode) + { + + f.Geometry.AltitudeMode = (buildMode.Equals(EnumBuildMode.Alititude)) ? EnumAltitudeMode.RelativeToGround : EnumAltitudeMode.Absolute; + + GSOGeoPolyline3D line = f.Geometry as GSOGeoPolyline3D; + if (line == null) + { + return null; //log4net 记录错误处理 + } + + double deep1 = 0; + double deep2 = 0; + + GSOPoint3ds pt3ds = new GSOPoint3ds(); + for (int n = 0; n < line[0].Count; n++) + { + GSOPoint3d pt3d = line[0][n]; + pt3d.Z = 0; + + pt3ds.Add(pt3d); + } + line[0] = pt3ds; + return line; + } + + } +} diff --git a/HTForms/FrmPipelineModelDataBase.cs b/HTForms/FrmPipelineModelDataBase.cs index 84a2d7b..3076bdd 100644 --- a/HTForms/FrmPipelineModelDataBase.cs +++ b/HTForms/FrmPipelineModelDataBase.cs @@ -91,6 +91,7 @@ } else datasource = ds; + if (comboBoxExLayer.Text.Trim() == "") { MessageBox.Show("请选择一个图层文件!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning); @@ -126,20 +127,12 @@ comboBoxExLayer.Text)); if (layer == null) return; - FieldValidate fieldValidate = FieldValidateFactory.Create(ValidateConfig.LoadConfig(), - getEnumValidateType()); - - if (!fieldValidate.Validate(layer)) + if (txtModelLayer.Text != "传感设备图层") { - DateTime dt=DateTime.Now; - string logFilePath = Application.StartupPath + "\\log\\" + dt.Year + "\\" + dt.Year + dt.Month + "\\" + dt.Year + - dt.Month + dt.Day + ".txt"; - MessageBox.Show("选择的数据不符合数据规范,详情见日志" + logFilePath, "提示"); - return; + if (!getValidateResult(layer)) + return; } - ModelBuilder lineBuilder = new LineBuilder(datasource); - LineParam lineParam = new LineParam(); lineParam.layerName = txtModelLayer.Text; lineParam.uniqueIdFieldName = cmbID.Text; @@ -149,14 +142,17 @@ lineParam.diameterFieldName = cmbRadius.Text; lineParam.relativeMode = (cmbReference.Text == "管顶") ? 0 : 1; lineParam.lineColor = btnPipelineColor.BackColor; - lineParam.transparency=Convert.ToByte(ComboboxRansparency.Value); + lineParam.transparency = Convert.ToByte(ComboboxRansparency.Value); lineParam.cornerSliceAngle = Convert.ToDouble(textBoxCornerSliceAngle.Text); - lineParam.sliceNum=Convert.ToInt32(txtSlice.Text); + lineParam.sliceNum = Convert.ToInt32(txtSlice.Text); lineParam.channelWidth = comboBoxExWidth.Text; lineParam.channelHeight = comboBoxExHeight.Text; - lineBuilder.build(layer, checkBoxAdd.Checked ? EnumUpdateMode.Append : EnumUpdateMode.Update, - checkBoxDeep.Checked ? EnumBuildMode.Depth : EnumBuildMode.Alititude, lineParam); + if (txtModelLayer.Text != "传感设备图层") + lineBuilder(layer, lineParam); + else + gxLineBuilder(layer, lineParam); + addLayerToGlobeControl(lineParam.layerName); //this.DialogResult = DialogResult.OK; MessageBox.Show("入库完成!", "提示"); @@ -167,6 +163,33 @@ } } + bool getValidateResult(GSOLayer layer) + { + FieldValidate fieldValidate = FieldValidateFactory.Create(ValidateConfig.LoadConfig(), + getEnumValidateType()); + + if (fieldValidate.Validate(layer)) return true; + DateTime dt = DateTime.Now; + string logFilePath = Application.StartupPath + "\\log\\" + dt.Year + "\\" + dt.Year + dt.Month + + "\\" + dt.Year + dt.Month + dt.Day + ".txt"; + MessageBox.Show("选择的数据不符合数据规范,详情见日志" + logFilePath, "提示"); + return false; + } + + void lineBuilder(GSOLayer layer,LineParam lineParam) + { + ModelBuilder lineBuilder = new LineBuilder(datasource); + lineBuilder.build(layer, checkBoxAdd.Checked ? EnumUpdateMode.Append : EnumUpdateMode.Update, + checkBoxDeep.Checked ? EnumBuildMode.Depth : EnumBuildMode.Alititude, lineParam); + } + + void gxLineBuilder(GSOLayer layer, LineParam lineParam) + { + ModelBuilder lineBuilder = new GXBuilder(datasource); + lineBuilder.build(layer, checkBoxAdd.Checked ? EnumUpdateMode.Append : EnumUpdateMode.Update, + checkBoxDeep.Checked ? EnumBuildMode.Depth : EnumBuildMode.Alititude, lineParam); + } + private EnumValidateType getEnumValidateType() { if (comboBoxExWidth.Text != "") diff --git a/LSPipeline.csproj b/LSPipeline.csproj index 477d8ba..599b492 100644 --- a/LSPipeline.csproj +++ b/LSPipeline.csproj @@ -222,6 +222,7 @@ FrmUpdateLayerFieldValues.cs + Form @@ -243,6 +244,7 @@ + True diff --git a/LSPipeline.suo b/LSPipeline.suo index c930f27..92b5d7d 100644 --- a/LSPipeline.suo +++ b/LSPipeline.suo Binary files differ diff --git a/OracleUtils.cs b/OracleUtils.cs new file mode 100644 index 0000000..c79d316 --- /dev/null +++ b/OracleUtils.cs @@ -0,0 +1,1271 @@ +using System; +using System.Collections; +using System.Data; +using System.Data.OracleClient; + +namespace WorldGIS +{ + public abstract class OracleUtils + { + // Read the connection strings from the configuration file + //public static readonly string ConnectionString = System.Configuration.ConfigurationSettings.AppSettings["ConnectionString"]; + public static readonly string ConnectionString = @"Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=" + Utility.DBServer + + ")(PORT=1521))(CONNECT_DATA=(SID=" + Utility.Database + + ")));Persist Security Info=True;User Id=" + Utility.UserID + + "; Password=" + Utility.DBPassword + ""; + + //Create a hashtable for the parameter cached + private static Hashtable parmCache = Hashtable.Synchronized(new Hashtable()); + + #region private utility methods & constructors + + //Since this class provides only static methods, make the default constructor private to prevent + //instances from being created with "new SqlHelper()". + private OracleUtils() { } + + /// + /// This method is used to attach array of SqlParameters to a SqlCommand. + /// + /// This method will assign a value of DbNull to any parameter with a direction of + /// InputOutput and a value of null. + /// + /// This behavior will prevent default values from being used, but + /// this will be the less common case than an intended pure output parameter (derived as InputOutput) + /// where the user provided no input value. + /// + /// The command to which the parameters will be added + /// an array of SqlParameters tho be added to command + private static void AttachParameters(OracleCommand command, OracleParameter[] commandParameters) + { + foreach (OracleParameter p in commandParameters) + { + //check for derived output value with no value assigned + if ((p.Direction == ParameterDirection.InputOutput) && (p.Value == null)) + { + p.Value = DBNull.Value; + } + + command.Parameters.Add(p); + } + } + + /// + /// This method assigns an array of values to an array of SqlParameters. + /// + /// array of SqlParameters to be assigned values + /// array of objects holding the values to be assigned + private static void AssignParameterValues(OracleParameter[] commandParameters, object[] parameterValues) + { + if ((commandParameters == null) || (parameterValues == null)) + { + //do nothing if we get no data + return; + } + + // we must have the same number of values as we pave parameters to put them in + if (commandParameters.Length != parameterValues.Length) + { + throw new ArgumentException("Parameter count does not match Parameter Value count."); + } + + //iterate through the SqlParameters, assigning the values from the corresponding position in the + //value array + for (int i = 0, j = commandParameters.Length; i < j; i++) + { + commandParameters[i].Value = parameterValues[i]; + } + } + + /// + /// This method opens (if necessary) and assigns a connection, transaction, command type and parameters + /// to the provided command. + /// + /// the SqlCommand to be prepared + /// a valid OracleConnection, on which to execute this command + /// a valid OracleTransaction, or 'null' + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an array of SqlParameters to be associated with the command or 'null' if no parameters are required + private static void PrepareCommand(OracleCommand command, OracleConnection connection, OracleTransaction transaction, CommandType commandType, string commandText, OracleParameter[] commandParameters) + { + //if the provided connection is not open, we will open it + if (connection.State != ConnectionState.Open) + { + connection.Open(); + } + + //associate the connection with the command + command.Connection = connection; + + //set the command text (stored procedure name or SQL statement) + command.CommandText = commandText; + + //if we were provided a transaction, assign it. + if (transaction != null) + { + command.Transaction = transaction; + } + + //set the command type + command.CommandType = commandType; + + //attach the command parameters if they are provided + if (commandParameters != null) + { + AttachParameters(command, commandParameters); + } + } + + + #endregion private utility methods & constructors + + #region ExecuteNonQuery + + /// + /// Execute a SqlCommand (that returns no resultset and takes no parameters) against the database specified in + /// the connection string. + /// + /// + /// e.g.: + /// int result = ExecuteNonQuery(connString, CommandType.StoredProcedure, "PublishOrders"); + /// + /// a valid connection string for a OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an int representing the number of rows affected by the command + public static int ExecuteNonQuery(string connectionString, CommandType commandType, string commandText) + { + //pass through the call providing null for the set of SqlParameters + return ExecuteNonQuery(connectionString, commandType, commandText, null); + } + + /// + /// Execute a SqlCommand (that returns no resultset) against the database specified in the connection string + /// using the provided parameters. + /// + /// + /// e.g.: + /// int result = ExecuteNonQuery(connString, CommandType.StoredProcedure, "PublishOrders", new OracleParameter("@prodid", 24)); + /// + /// a valid connection string for a OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an array of SqlParamters used to execute the command + /// an int representing the number of rows affected by the command + public static int ExecuteNonQuery(string connectionString, CommandType commandType, string commandText, params OracleParameter[] commandParameters) + { + //create & open a OracleConnection, and dispose of it after we are done. + using (OracleConnection cn = new OracleConnection(connectionString)) + { + cn.Open(); + + //call the overload that takes a connection in place of the connection string + return ExecuteNonQuery(cn, commandType, commandText, commandParameters); + } + } + + /// + /// Execute a stored procedure via a SqlCommand (that returns no resultset) against the database specified in + /// the connection string using the provided parameter values. This method will query the database to discover the parameters for the + /// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. + /// + /// + /// This method provides no access to output parameters or the stored procedure's return value parameter. + /// + /// e.g.: + /// int result = ExecuteNonQuery(connString, "PublishOrders", 24, 36); + /// + /// a valid connection string for a OracleConnection + /// the name of the stored prcedure + /// an array of objects to be assigned as the input values of the stored procedure + /// an int representing the number of rows affected by the command + public static int ExecuteNonQuery(string connectionString, string spName, params object[] parameterValues) + { + //if we receive parameter values, we need to figure out where they go + if ((parameterValues != null) && (parameterValues.Length > 0)) + { + //pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache) + OracleParameter[] commandParameters = OracleHelperParameterCache.GetSpParameterSet(connectionString, spName); + + //assign the provided values to these parameters based on parameter order + AssignParameterValues(commandParameters, parameterValues); + + //call the overload that takes an array of SqlParameters + return ExecuteNonQuery(connectionString, CommandType.StoredProcedure, spName, commandParameters); + } + //otherwise we can just call the SP without params + return ExecuteNonQuery(connectionString, CommandType.StoredProcedure, spName); + } + + /// + /// Execute a SqlCommand (that returns no resultset and takes no parameters) against the provided OracleConnection. + /// + /// + /// e.g.: + /// int result = ExecuteNonQuery(conn, CommandType.StoredProcedure, "PublishOrders"); + /// + /// a valid OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an int representing the number of rows affected by the command + public static int ExecuteNonQuery(OracleConnection connection, CommandType commandType, string commandText) + { + //pass through the call providing null for the set of SqlParameters + return ExecuteNonQuery(connection, commandType, commandText, null); + } + + /// + /// Execute a SqlCommand (that returns no resultset) against the specified OracleConnection + /// using the provided parameters. + /// + /// + /// e.g.: + /// int result = ExecuteNonQuery(conn, CommandType.StoredProcedure, "PublishOrders", new OracleParameter("@prodid", 24)); + /// + /// a valid OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an array of SqlParamters used to execute the command + /// an int representing the number of rows affected by the command + public static int ExecuteNonQuery(OracleConnection connection, CommandType commandType, string commandText, params OracleParameter[] commandParameters) + { + //create a command and prepare it for execution + + OracleCommand cmd = new OracleCommand(); + PrepareCommand(cmd, connection, null, commandType, commandText, commandParameters); + + //finally, execute the command. + int retval = cmd.ExecuteNonQuery(); + + // detach the SqlParameters from the command object, so they can be used again. + cmd.Parameters.Clear(); + return retval; + } + + public static int ExecuteNonQueryWithTimeout(string connectionString, CommandType commandType, string commandText, int cmdTimeout) + { + //create a command and prepare it for execution + using (OracleConnection cn = new OracleConnection(connectionString)) + { + cn.Open(); + OracleCommand cmd = new OracleCommand(); + PrepareCommand(cmd, cn, null, commandType, commandText, null); + cmd.CommandTimeout = cmdTimeout; + //finally, execute the command. + int retval = cmd.ExecuteNonQuery(); + + // detach the SqlParameters from the command object, so they can be used again. + cmd.Parameters.Clear(); + return retval; + } + + } + /// + /// Execute a stored procedure via a SqlCommand (that returns no resultset) against the specified OracleConnection + /// using the provided parameter values. This method will query the database to discover the parameters for the + /// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. + /// + /// + /// This method provides no access to output parameters or the stored procedure's return value parameter. + /// + /// e.g.: + /// int result = ExecuteNonQuery(conn, "PublishOrders", 24, 36); + /// + /// a valid OracleConnection + /// the name of the stored procedure + /// an array of objects to be assigned as the input values of the stored procedure + /// an int representing the number of rows affected by the command + public static int ExecuteNonQuery(OracleConnection connection, string spName, params object[] parameterValues) + { + //if we receive parameter values, we need to figure out where they go + if ((parameterValues != null) && (parameterValues.Length > 0)) + { + //pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache) + OracleParameter[] commandParameters = OracleHelperParameterCache.GetSpParameterSet(connection.ConnectionString, spName); + + //assign the provided values to these parameters based on parameter order + AssignParameterValues(commandParameters, parameterValues); + + //call the overload that takes an array of SqlParameters + return ExecuteNonQuery(connection, CommandType.StoredProcedure, spName, commandParameters); + } + //otherwise we can just call the SP without params + return ExecuteNonQuery(connection, CommandType.StoredProcedure, spName); + } + + /// + /// Execute a SqlCommand (that returns no resultset and takes no parameters) against the provided OracleTransaction. + /// + /// + /// e.g.: + /// int result = ExecuteNonQuery(trans, CommandType.StoredProcedure, "PublishOrders"); + /// + /// a valid OracleTransaction + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an int representing the number of rows affected by the command + public static int ExecuteNonQuery(OracleTransaction transaction, CommandType commandType, string commandText) + { + //pass through the call providing null for the set of SqlParameters + return ExecuteNonQuery(transaction, commandType, commandText, null); + } + + /// + /// Execute a SqlCommand (that returns no resultset) against the specified OracleTransaction + /// using the provided parameters. + /// + /// + /// e.g.: + /// int result = ExecuteNonQuery(trans, CommandType.StoredProcedure, "GetOrders", new OracleParameter("@prodid", 24)); + /// + /// a valid OracleTransaction + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an array of SqlParamters used to execute the command + /// an int representing the number of rows affected by the command + public static int ExecuteNonQuery(OracleTransaction transaction, CommandType commandType, string commandText, params OracleParameter[] commandParameters) + { + //create a command and prepare it for execution + OracleCommand cmd = new OracleCommand(); + PrepareCommand(cmd, transaction.Connection, transaction, commandType, commandText, commandParameters); + + //finally, execute the command. + int retval = cmd.ExecuteNonQuery(); + + // detach the SqlParameters from the command object, so they can be used again. + cmd.Parameters.Clear(); + return retval; + } + + /// + /// Execute a stored procedure via a SqlCommand (that returns no resultset) against the specified + /// OracleTransaction using the provided parameter values. This method will query the database to discover the parameters for the + /// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. + /// + /// + /// This method provides no access to output parameters or the stored procedure's return value parameter. + /// + /// e.g.: + /// int result = ExecuteNonQuery(conn, trans, "PublishOrders", 24, 36); + /// + /// a valid OracleTransaction + /// the name of the stored procedure + /// an array of objects to be assigned as the input values of the stored procedure + /// an int representing the number of rows affected by the command + public static int ExecuteNonQuery(OracleTransaction transaction, string spName, params object[] parameterValues) + { + //if we receive parameter values, we need to figure out where they go + if ((parameterValues != null) && (parameterValues.Length > 0)) + { + //pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache) + OracleParameter[] commandParameters = OracleHelperParameterCache.GetSpParameterSet(transaction.Connection.ConnectionString, spName); + + //assign the provided values to these parameters based on parameter order + AssignParameterValues(commandParameters, parameterValues); + + //call the overload that takes an array of SqlParameters + return ExecuteNonQuery(transaction, CommandType.StoredProcedure, spName, commandParameters); + } + //otherwise we can just call the SP without params + return ExecuteNonQuery(transaction, CommandType.StoredProcedure, spName); + } + + + #endregion ExecuteNonQuery + + #region ExecuteDataSet + + /// + /// Execute a SqlCommand (that returns a resultset and takes no parameters) against the database specified in + /// the connection string. + /// + /// + /// e.g.: + /// DataSet ds = ExecuteDataset(connString, CommandType.StoredProcedure, "GetOrders"); + /// + /// a valid connection string for a OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// a dataset containing the resultset generated by the command + public static DataSet ExecuteDataset(string connectionString, CommandType commandType, string commandText) + { + //pass through the call providing null for the set of SqlParameters + return ExecuteDataset(connectionString, commandType, commandText, null); + } + + /// + /// Execute a SqlCommand (that returns a resultset) against the database specified in the connection string + /// using the provided parameters. + /// + /// + /// e.g.: + /// DataSet ds = ExecuteDataset(connString, CommandType.StoredProcedure, "GetOrders", new OracleParameter("@prodid", 24)); + /// + /// a valid connection string for a OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an array of SqlParamters used to execute the command + /// a dataset containing the resultset generated by the command + public static DataSet ExecuteDataset(string connectionString, CommandType commandType, string commandText, params OracleParameter[] commandParameters) + { + //create & open a OracleConnection, and dispose of it after we are done. + using (OracleConnection cn = new OracleConnection(connectionString)) + { + cn.Open(); + + //call the overload that takes a connection in place of the connection string + return ExecuteDataset(cn, commandType, commandText, commandParameters); + } + } + + /// + /// Execute a stored procedure via a SqlCommand (that returns a resultset) against the database specified in + /// the connection string using the provided parameter values. This method will query the database to discover the parameters for the + /// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. + /// + /// + /// This method provides no access to output parameters or the stored procedure's return value parameter. + /// + /// e.g.: + /// DataSet ds = ExecuteDataset(connString, "GetOrders", 24, 36); + /// + /// a valid connection string for a OracleConnection + /// the name of the stored procedure + /// an array of objects to be assigned as the input values of the stored procedure + /// a dataset containing the resultset generated by the command + public static DataSet ExecuteDataset(string connectionString, string spName, params object[] parameterValues) + { + //if we receive parameter values, we need to figure out where they go + if ((parameterValues != null) && (parameterValues.Length > 0)) + { + //pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache) + OracleParameter[] commandParameters = OracleHelperParameterCache.GetSpParameterSet(connectionString, spName); + + //assign the provided values to these parameters based on parameter order + AssignParameterValues(commandParameters, parameterValues); + + //call the overload that takes an array of SqlParameters + return ExecuteDataset(connectionString, CommandType.StoredProcedure, spName, commandParameters); + } + //otherwise we can just call the SP without params + return ExecuteDataset(connectionString, CommandType.StoredProcedure, spName); + } + + /// + /// Execute a SqlCommand (that returns a resultset and takes no parameters) against the provided OracleConnection. + /// + /// + /// e.g.: + /// DataSet ds = ExecuteDataset(conn, CommandType.StoredProcedure, "GetOrders"); + /// + /// a valid OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// a dataset containing the resultset generated by the command + public static DataSet ExecuteDataset(OracleConnection connection, CommandType commandType, string commandText) + { + //pass through the call providing null for the set of SqlParameters + return ExecuteDataset(connection, commandType, commandText, null); + } + + /// + /// Execute a SqlCommand (that returns a resultset) against the specified OracleConnection + /// using the provided parameters. + /// + /// + /// e.g.: + /// DataSet ds = ExecuteDataset(conn, CommandType.StoredProcedure, "GetOrders", new OracleParameter("@prodid", 24)); + /// + /// a valid OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an array of SqlParamters used to execute the command + /// a dataset containing the resultset generated by the command + public static DataSet ExecuteDataset(OracleConnection connection, CommandType commandType, string commandText, params OracleParameter[] commandParameters) + { + //create a command and prepare it for execution + OracleCommand cmd = new OracleCommand(); + PrepareCommand(cmd, connection, null, commandType, commandText, commandParameters); + + //create the DataAdapter & DataSet + OracleDataAdapter da = new OracleDataAdapter(cmd); + DataSet ds = new DataSet(); + + //fill the DataSet using default values for DataTable names, etc. + da.Fill(ds); + + // detach the SqlParameters from the command object, so they can be used again. + cmd.Parameters.Clear(); + + //return the dataset + return ds; + } + + /// + /// Execute a stored procedure via a SqlCommand (that returns a resultset) against the specified OracleConnection + /// using the provided parameter values. This method will query the database to discover the parameters for the + /// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. + /// + /// + /// This method provides no access to output parameters or the stored procedure's return value parameter. + /// + /// e.g.: + /// DataSet ds = ExecuteDataset(conn, "GetOrders", 24, 36); + /// + /// a valid OracleConnection + /// the name of the stored procedure + /// an array of objects to be assigned as the input values of the stored procedure + /// a dataset containing the resultset generated by the command + public static DataSet ExecuteDataset(OracleConnection connection, string spName, params object[] parameterValues) + { + //if we receive parameter values, we need to figure out where they go + if ((parameterValues != null) && (parameterValues.Length > 0)) + { + //pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache) + OracleParameter[] commandParameters = OracleHelperParameterCache.GetSpParameterSet(connection.ConnectionString, spName); + + //assign the provided values to these parameters based on parameter order + AssignParameterValues(commandParameters, parameterValues); + + //call the overload that takes an array of SqlParameters + return ExecuteDataset(connection, CommandType.StoredProcedure, spName, commandParameters); + } + //otherwise we can just call the SP without params + return ExecuteDataset(connection, CommandType.StoredProcedure, spName); + } + + /// + /// Execute a SqlCommand (that returns a resultset and takes no parameters) against the provided OracleTransaction. + /// + /// + /// e.g.: + /// DataSet ds = ExecuteDataset(trans, CommandType.StoredProcedure, "GetOrders"); + /// + /// a valid OracleTransaction + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// a dataset containing the resultset generated by the command + public static DataSet ExecuteDataset(OracleTransaction transaction, CommandType commandType, string commandText) + { + //pass through the call providing null for the set of SqlParameters + return ExecuteDataset(transaction, commandType, commandText, null); + } + + /// + /// Execute a SqlCommand (that returns a resultset) against the specified OracleTransaction + /// using the provided parameters. + /// + /// + /// e.g.: + /// DataSet ds = ExecuteDataset(trans, CommandType.StoredProcedure, "GetOrders", new OracleParameter("@prodid", 24)); + /// + /// a valid OracleTransaction + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an array of SqlParamters used to execute the command + /// a dataset containing the resultset generated by the command + public static DataSet ExecuteDataset(OracleTransaction transaction, CommandType commandType, string commandText, params OracleParameter[] commandParameters) + { + //create a command and prepare it for execution + OracleCommand cmd = new OracleCommand(); + PrepareCommand(cmd, transaction.Connection, transaction, commandType, commandText, commandParameters); + + //create the DataAdapter & DataSet + OracleDataAdapter da = new OracleDataAdapter(cmd); + DataSet ds = new DataSet(); + + //fill the DataSet using default values for DataTable names, etc. + da.Fill(ds); + + // detach the SqlParameters from the command object, so they can be used again. + cmd.Parameters.Clear(); + + //return the dataset + return ds; + } + + /// + /// Execute a stored procedure via a SqlCommand (that returns a resultset) against the specified + /// OracleTransaction using the provided parameter values. This method will query the database to discover the parameters for the + /// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. + /// + /// + /// This method provides no access to output parameters or the stored procedure's return value parameter. + /// + /// e.g.: + /// DataSet ds = ExecuteDataset(trans, "GetOrders", 24, 36); + /// + /// a valid OracleTransaction + /// the name of the stored procedure + /// an array of objects to be assigned as the input values of the stored procedure + /// a dataset containing the resultset generated by the command + public static DataSet ExecuteDataset(OracleTransaction transaction, string spName, params object[] parameterValues) + { + //if we receive parameter values, we need to figure out where they go + if ((parameterValues != null) && (parameterValues.Length > 0)) + { + //pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache) + OracleParameter[] commandParameters = OracleHelperParameterCache.GetSpParameterSet(transaction.Connection.ConnectionString, spName); + + //assign the provided values to these parameters based on parameter order + AssignParameterValues(commandParameters, parameterValues); + + //call the overload that takes an array of SqlParameters + return ExecuteDataset(transaction, CommandType.StoredProcedure, spName, commandParameters); + } + //otherwise we can just call the SP without params + return ExecuteDataset(transaction, CommandType.StoredProcedure, spName); + } + + #endregion ExecuteDataSet + + #region ExecuteReader + + /// + /// this enum is used to indicate whether the connection was provided by the caller, or created by SqlHelper, so that + /// we can set the appropriate CommandBehavior when calling ExecuteReader() + /// + private enum OracleConnectionOwnership + { + /// Connection is owned and managed by SqlHelper + Internal, + /// Connection is owned and managed by the caller + External + } + + /// + /// Create and prepare a SqlCommand, and call ExecuteReader with the appropriate CommandBehavior. + /// + /// + /// If we created and opened the connection, we want the connection to be closed when the DataReader is closed. + /// + /// If the caller provided the connection, we want to leave it to them to manage. + /// + /// a valid OracleConnection, on which to execute this command + /// a valid OracleTransaction, or 'null' + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an array of SqlParameters to be associated with the command or 'null' if no parameters are required + /// indicates whether the connection parameter was provided by the caller, or created by SqlHelper + /// SqlDataReader containing the results of the command + private static OracleDataReader ExecuteReader(OracleConnection connection, OracleTransaction transaction, CommandType commandType, string commandText, OracleParameter[] commandParameters, OracleConnectionOwnership connectionOwnership) + { + //create a command and prepare it for execution + OracleCommand cmd = new OracleCommand(); + PrepareCommand(cmd, connection, transaction, commandType, commandText, commandParameters); + + //create a reader + OracleDataReader dr; + + // call ExecuteReader with the appropriate CommandBehavior + if (connectionOwnership == OracleConnectionOwnership.External) + { + dr = cmd.ExecuteReader(); + } + else + { + dr = cmd.ExecuteReader(CommandBehavior.CloseConnection); + + } + + // detach the SqlParameters from the command object, so they can be used again. + cmd.Parameters.Clear(); + + return dr; + } + + /// + /// Execute a SqlCommand (that returns a resultset and takes no parameters) against the database specified in + /// the connection string. + /// + /// + /// e.g.: + /// SqlDataReader dr = ExecuteReader(connString, CommandType.StoredProcedure, "GetOrders"); + /// + /// a valid connection string for a OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// a SqlDataReader containing the resultset generated by the command + public static OracleDataReader ExecuteReader(string connectionString, CommandType commandType, string commandText) + { + //pass through the call providing null for the set of SqlParameters + return ExecuteReader(connectionString, commandType, commandText, null); + } + + /// + /// Execute a SqlCommand (that returns a resultset) against the database specified in the connection string + /// using the provided parameters. + /// + /// + /// e.g.: + /// SqlDataReader dr = ExecuteReader(connString, CommandType.StoredProcedure, "GetOrders", new OracleParameter("@prodid", 24)); + /// + /// a valid connection string for a OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an array of SqlParamters used to execute the command + /// a SqlDataReader containing the resultset generated by the command + public static OracleDataReader ExecuteReader(string connectionString, CommandType commandType, string commandText, params OracleParameter[] commandParameters) + { + //create & open a OracleConnection + OracleConnection cn = new OracleConnection(connectionString); + cn.Open(); + + try + { + //call the private overload that takes an internally owned connection in place of the connection string + return ExecuteReader(cn, null, commandType, commandText, commandParameters, OracleConnectionOwnership.Internal); + } + catch + { + //if we fail to return the SqlDatReader, we need to close the connection ourselves + cn.Close(); + throw; + } + } + + /// + /// Execute a stored procedure via a SqlCommand (that returns a resultset) against the database specified in + /// the connection string using the provided parameter values. This method will query the database to discover the parameters for the + /// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. + /// + /// + /// This method provides no access to output parameters or the stored procedure's return value parameter. + /// + /// e.g.: + /// SqlDataReader dr = ExecuteReader(connString, "GetOrders", 24, 36); + /// + /// a valid connection string for a OracleConnection + /// the name of the stored procedure + /// an array of objects to be assigned as the input values of the stored procedure + /// a SqlDataReader containing the resultset generated by the command + public static OracleDataReader ExecuteReader(string connectionString, string spName, params object[] parameterValues) + { + //if we receive parameter values, we need to figure out where they go + if ((parameterValues != null) && (parameterValues.Length > 0)) + { + //pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache) + OracleParameter[] commandParameters = OracleHelperParameterCache.GetSpParameterSet(connectionString, spName); + + //assign the provided values to these parameters based on parameter order + AssignParameterValues(commandParameters, parameterValues); + + //call the overload that takes an array of SqlParameters + return ExecuteReader(connectionString, CommandType.StoredProcedure, spName, commandParameters); + } + //otherwise we can just call the SP without params + return ExecuteReader(connectionString, CommandType.StoredProcedure, spName); + } + + /// + /// Execute a SqlCommand (that returns a resultset and takes no parameters) against the provided OracleConnection. + /// + /// + /// e.g.: + /// SqlDataReader dr = ExecuteReader(conn, CommandType.StoredProcedure, "GetOrders"); + /// + /// a valid OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// a SqlDataReader containing the resultset generated by the command + public static OracleDataReader ExecuteReader(OracleConnection connection, CommandType commandType, string commandText) + { + //pass through the call providing null for the set of SqlParameters + return ExecuteReader(connection, commandType, commandText, null); + } + + /// + /// Execute a SqlCommand (that returns a resultset) against the specified OracleConnection + /// using the provided parameters. + /// + /// + /// e.g.: + /// SqlDataReader dr = ExecuteReader(conn, CommandType.StoredProcedure, "GetOrders", new OracleParameter("@prodid", 24)); + /// + /// a valid OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an array of SqlParamters used to execute the command + /// a SqlDataReader containing the resultset generated by the command + public static OracleDataReader ExecuteReader(OracleConnection connection, CommandType commandType, string commandText, params OracleParameter[] commandParameters) + { + //pass through the call to the private overload using a null transaction value and an externally owned connection + return ExecuteReader(connection, null, commandType, commandText, commandParameters, OracleConnectionOwnership.External); + } + + /// + /// Execute a stored procedure via a SqlCommand (that returns a resultset) against the specified OracleConnection + /// using the provided parameter values. This method will query the database to discover the parameters for the + /// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. + /// + /// + /// This method provides no access to output parameters or the stored procedure's return value parameter. + /// + /// e.g.: + /// SqlDataReader dr = ExecuteReader(conn, "GetOrders", 24, 36); + /// + /// a valid OracleConnection + /// the name of the stored procedure + /// an array of objects to be assigned as the input values of the stored procedure + /// a SqlDataReader containing the resultset generated by the command + public static OracleDataReader ExecuteReader(OracleConnection connection, string spName, params object[] parameterValues) + { + //if we receive parameter values, we need to figure out where they go + if ((parameterValues != null) && (parameterValues.Length > 0)) + { + OracleParameter[] commandParameters = OracleHelperParameterCache.GetSpParameterSet(connection.ConnectionString, spName); + + AssignParameterValues(commandParameters, parameterValues); + + return ExecuteReader(connection, CommandType.StoredProcedure, spName, commandParameters); + } + //otherwise we can just call the SP without params + return ExecuteReader(connection, CommandType.StoredProcedure, spName); + } + + /// + /// Execute a SqlCommand (that returns a resultset and takes no parameters) against the provided OracleTransaction. + /// + /// + /// e.g.: + /// SqlDataReader dr = ExecuteReader(trans, CommandType.StoredProcedure, "GetOrders"); + /// + /// a valid OracleTransaction + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// a SqlDataReader containing the resultset generated by the command + public static OracleDataReader ExecuteReader(OracleTransaction transaction, CommandType commandType, string commandText) + { + //pass through the call providing null for the set of SqlParameters + return ExecuteReader(transaction, commandType, commandText, null); + } + + /// + /// Execute a SqlCommand (that returns a resultset) against the specified OracleTransaction + /// using the provided parameters. + /// + /// + /// e.g.: + /// SqlDataReader dr = ExecuteReader(trans, CommandType.StoredProcedure, "GetOrders", new OracleParameter("@prodid", 24)); + /// + /// a valid OracleTransaction + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an array of SqlParamters used to execute the command + /// a SqlDataReader containing the resultset generated by the command + public static OracleDataReader ExecuteReader(OracleTransaction transaction, CommandType commandType, string commandText, params OracleParameter[] commandParameters) + { + //pass through to private overload, indicating that the connection is owned by the caller + return ExecuteReader(transaction.Connection, transaction, commandType, commandText, commandParameters, OracleConnectionOwnership.External); + } + + /// + /// Execute a stored procedure via a SqlCommand (that returns a resultset) against the specified + /// OracleTransaction using the provided parameter values. This method will query the database to discover the parameters for the + /// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. + /// + /// + /// This method provides no access to output parameters or the stored procedure's return value parameter. + /// + /// e.g.: + /// SqlDataReader dr = ExecuteReader(trans, "GetOrders", 24, 36); + /// + /// a valid OracleTransaction + /// the name of the stored procedure + /// an array of objects to be assigned as the input values of the stored procedure + /// a SqlDataReader containing the resultset generated by the command + public static OracleDataReader ExecuteReader(OracleTransaction transaction, string spName, params object[] parameterValues) + { + //if we receive parameter values, we need to figure out where they go + if ((parameterValues != null) && (parameterValues.Length > 0)) + { + OracleParameter[] commandParameters = OracleHelperParameterCache.GetSpParameterSet(transaction.Connection.ConnectionString, spName); + + AssignParameterValues(commandParameters, parameterValues); + + return ExecuteReader(transaction, CommandType.StoredProcedure, spName, commandParameters); + } + //otherwise we can just call the SP without params + return ExecuteReader(transaction, CommandType.StoredProcedure, spName); + } + + #endregion ExecuteReader + + #region ExecuteScalar + + /// + /// Execute a OracleCommand (that returns a 1x1 resultset and takes no parameters) against the database specified in + /// the connection string. + /// + /// + /// e.g.: + /// int orderCount = (int)ExecuteScalar(connString, CommandType.StoredProcedure, "GetOrderCount"); + /// + /// a valid connection string for a OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an object containing the value in the 1x1 resultset generated by the command + public static object ExecuteScalar(string connectionString, CommandType commandType, string commandText) + { + //pass through the call providing null for the set of SqlParameters + return ExecuteScalar(connectionString, commandType, commandText, null); + } + + /// + /// Execute a OracleCommand (that returns a 1x1 resultset) against the database specified in the connection string + /// using the provided parameters. + /// + /// + /// e.g.: + /// int orderCount = (int)ExecuteScalar(connString, CommandType.StoredProcedure, "GetOrderCount", new OracleParameter("@prodid", 24)); + /// + /// a valid connection string for a OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an array of SqlParamters used to execute the command + /// an object containing the value in the 1x1 resultset generated by the command + public static object ExecuteScalar(string connectionString, CommandType commandType, string commandText, params OracleParameter[] commandParameters) + { + //create & open a OracleConnection, and dispose of it after we are done. + using (OracleConnection cn = new OracleConnection(connectionString)) + { + cn.Open(); + + //call the overload that takes a connection in place of the connection string + return ExecuteScalar(cn, commandType, commandText, commandParameters); + } + } + + /// + /// Execute a stored procedure via a OracleCommand (that returns a 1x1 resultset) against the database specified in + /// the connection string using the provided parameter values. This method will query the database to discover the parameters for the + /// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. + /// + /// + /// This method provides no access to output parameters or the stored procedure's return value parameter. + /// + /// e.g.: + /// int orderCount = (int)ExecuteScalar(connString, "GetOrderCount", 24, 36); + /// + /// a valid connection string for a OracleConnection + /// the name of the stored procedure + /// an array of objects to be assigned as the input values of the stored procedure + /// an object containing the value in the 1x1 resultset generated by the command + public static object ExecuteScalar(string connectionString, string spName, params object[] parameterValues) + { + //if we receive parameter values, we need to figure out where they go + if ((parameterValues != null) && (parameterValues.Length > 0)) + { + //pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache) + OracleParameter[] commandParameters = OracleHelperParameterCache.GetSpParameterSet(connectionString, spName); + + //assign the provided values to these parameters based on parameter order + AssignParameterValues(commandParameters, parameterValues); + + //call the overload that takes an array of SqlParameters + return ExecuteScalar(connectionString, CommandType.StoredProcedure, spName, commandParameters); + } + //otherwise we can just call the SP without params + return ExecuteScalar(connectionString, CommandType.StoredProcedure, spName); + } + + /// + /// Execute a OracleCommand (that returns a 1x1 resultset and takes no parameters) against the provided OracleConnection. + /// + /// + /// e.g.: + /// int orderCount = (int)ExecuteScalar(conn, CommandType.StoredProcedure, "GetOrderCount"); + /// + /// a valid OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an object containing the value in the 1x1 resultset generated by the command + public static object ExecuteScalar(OracleConnection connection, CommandType commandType, string commandText) + { + //pass through the call providing null for the set of SqlParameters + return ExecuteScalar(connection, commandType, commandText, null); + } + + /// + /// Execute a OracleCommand (that returns a 1x1 resultset) against the specified OracleConnection + /// using the provided parameters. + /// + /// + /// e.g.: + /// int orderCount = (int)ExecuteScalar(conn, CommandType.StoredProcedure, "GetOrderCount", new OracleParameter("@prodid", 24)); + /// + /// a valid OracleConnection + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an array of SqlParamters used to execute the command + /// an object containing the value in the 1x1 resultset generated by the command + public static object ExecuteScalar(OracleConnection connection, CommandType commandType, string commandText, params OracleParameter[] commandParameters) + { + //create a command and prepare it for execution + OracleCommand cmd = new OracleCommand(); + PrepareCommand(cmd, connection, null, commandType, commandText, commandParameters); + + //execute the command & return the results + object retval = cmd.ExecuteScalar(); + + // detach the SqlParameters from the command object, so they can be used again. + cmd.Parameters.Clear(); + return retval; + + } + + /// + /// Execute a stored procedure via a OracleCommand (that returns a 1x1 resultset) against the specified OracleConnection + /// using the provided parameter values. This method will query the database to discover the parameters for the + /// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. + /// + /// + /// This method provides no access to output parameters or the stored procedure's return value parameter. + /// + /// e.g.: + /// int orderCount = (int)ExecuteScalar(conn, "GetOrderCount", 24, 36); + /// + /// a valid OracleConnection + /// the name of the stored procedure + /// an array of objects to be assigned as the input values of the stored procedure + /// an object containing the value in the 1x1 resultset generated by the command + public static object ExecuteScalar(OracleConnection connection, string spName, params object[] parameterValues) + { + //if we receive parameter values, we need to figure out where they go + if ((parameterValues != null) && (parameterValues.Length > 0)) + { + //pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache) + OracleParameter[] commandParameters = OracleHelperParameterCache.GetSpParameterSet(connection.ConnectionString, spName); + + //assign the provided values to these parameters based on parameter order + AssignParameterValues(commandParameters, parameterValues); + + //call the overload that takes an array of SqlParameters + return ExecuteScalar(connection, CommandType.StoredProcedure, spName, commandParameters); + } + //otherwise we can just call the SP without params + return ExecuteScalar(connection, CommandType.StoredProcedure, spName); + } + + /// + /// Execute a OracleCommand (that returns a 1x1 resultset and takes no parameters) against the provided OracleTransaction. + /// + /// + /// e.g.: + /// int orderCount = (int)ExecuteScalar(trans, CommandType.StoredProcedure, "GetOrderCount"); + /// + /// a valid OracleTransaction + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an object containing the value in the 1x1 resultset generated by the command + public static object ExecuteScalar(OracleTransaction transaction, CommandType commandType, string commandText) + { + //pass through the call providing null for the set of SqlParameters + return ExecuteScalar(transaction, commandType, commandText, null); + } + + /// + /// Execute a OracleCommand (that returns a 1x1 resultset) against the specified OracleTransaction + /// using the provided parameters. + /// + /// + /// e.g.: + /// int orderCount = (int)ExecuteScalar(trans, CommandType.StoredProcedure, "GetOrderCount", new OracleParameter("@prodid", 24)); + /// + /// a valid OracleTransaction + /// the CommandType (stored procedure, text, etc.) + /// the stored procedure name or T-SQL command + /// an array of SqlParamters used to execute the command + /// an object containing the value in the 1x1 resultset generated by the command + public static object ExecuteScalar(OracleTransaction transaction, CommandType commandType, string commandText, params OracleParameter[] commandParameters) + { + //create a command and prepare it for execution + OracleCommand cmd = new OracleCommand(); + PrepareCommand(cmd, transaction.Connection, transaction, commandType, commandText, commandParameters); + + //execute the command & return the results + object retval = cmd.ExecuteScalar(); + + // detach the SqlParameters from the command object, so they can be used again. + cmd.Parameters.Clear(); + return retval; + } + + /// + /// Execute a stored procedure via a OracleCommand (that returns a 1x1 resultset) against the specified + /// OracleTransaction using the provided parameter values. This method will query the database to discover the parameters for the + /// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. + /// + /// + /// This method provides no access to output parameters or the stored procedure's return value parameter. + /// + /// e.g.: + /// int orderCount = (int)ExecuteScalar(trans, "GetOrderCount", 24, 36); + /// + /// a valid OracleTransaction + /// the name of the stored procedure + /// an array of objects to be assigned as the input values of the stored procedure + /// an object containing the value in the 1x1 resultset generated by the command + public static object ExecuteScalar(OracleTransaction transaction, string spName, params object[] parameterValues) + { + //if we receive parameter values, we need to figure out where they go + if ((parameterValues != null) && (parameterValues.Length > 0)) + { + //pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache) + OracleParameter[] commandParameters = OracleHelperParameterCache.GetSpParameterSet(transaction.Connection.ConnectionString, spName); + + //assign the provided values to these parameters based on parameter order + AssignParameterValues(commandParameters, parameterValues); + + //call the overload that takes an array of SqlParameters + return ExecuteScalar(transaction, CommandType.StoredProcedure, spName, commandParameters); + } + //otherwise we can just call the SP without params + return ExecuteScalar(transaction, CommandType.StoredProcedure, spName); + } + + #endregion ExecuteScalar + + + } + /// + /// OracleHelperParameterCache provides functions to leverage a static cache of procedure parameters, and the + /// ability to discover parameters for stored procedures at run-time. + /// + /// + + public sealed class OracleHelperParameterCache + { + #region private methods, variables, and constructors + + //Since this class provides only static methods, make the default constructor private to prevent + //instances from being created with "new SqlHelperParameterCache()". + private OracleHelperParameterCache() { } + + private static Hashtable paramCache = Hashtable.Synchronized(new Hashtable()); + + /// + /// resolve at run time the appropriate set of SqlParameters for a stored procedure + /// + /// a valid connection string for a OracleConnection + /// the name of the stored procedure + /// whether or not to include their return value parameter + /// + private static OracleParameter[] DiscoverSpParameterSet(string connectionString, string spName, bool includeReturnValueParameter) + { + using (OracleConnection cn = new OracleConnection(connectionString)) + using (OracleCommand cmd = new OracleCommand(spName, cn)) + { + cn.Open(); + cmd.CommandType = CommandType.StoredProcedure; + OracleCommandBuilder.DeriveParameters(cmd); + + if (!includeReturnValueParameter) + { + cmd.Parameters.RemoveAt(0); + } + + OracleParameter[] discoveredParameters = new OracleParameter[cmd.Parameters.Count]; ; + + cmd.Parameters.CopyTo(discoveredParameters, 0); + + return discoveredParameters; + } + } + + //deep copy of cached OracleParameter array + private static OracleParameter[] CloneParameters(OracleParameter[] originalParameters) + { + OracleParameter[] clonedParameters = new OracleParameter[originalParameters.Length]; + + for (int i = 0, j = originalParameters.Length; i < j; i++) + { + clonedParameters[i] = (OracleParameter)((ICloneable)originalParameters[i]).Clone(); + } + + return clonedParameters; + } + + #endregion private methods, variables, and constructors + + #region caching functions + + /// + /// add parameter array to the cache + /// + /// a valid connection string for a OracleConnection + /// the stored procedure name or T-SQL command + /// an array of SqlParamters to be cached + public static void CacheParameterSet(string connectionString, string commandText, params OracleParameter[] commandParameters) + { + string hashKey = connectionString + ":" + commandText; + + paramCache[hashKey] = commandParameters; + } + + /// + /// retrieve a parameter array from the cache + /// + /// a valid connection string for a OracleConnection + /// the stored procedure name or T-SQL command + /// an array of SqlParamters + public static OracleParameter[] GetCachedParameterSet(string connectionString, string commandText) + { + string hashKey = connectionString + ":" + commandText; + + OracleParameter[] cachedParameters = (OracleParameter[])paramCache[hashKey]; + + if (cachedParameters == null) + { + return null; + } + return CloneParameters(cachedParameters); + } + + #endregion caching functions + + #region Parameter Discovery Functions + + /// + /// Retrieves the set of SqlParameters appropriate for the stored procedure + /// + /// + /// This method will query the database for this information, and then store it in a cache for future requests. + /// + /// a valid connection string for a OracleConnection + /// the name of the stored procedure + /// an array of SqlParameters + public static OracleParameter[] GetSpParameterSet(string connectionString, string spName) + { + return GetSpParameterSet(connectionString, spName, false); + } + + /// + /// Retrieves the set of SqlParameters appropriate for the stored procedure + /// + /// + /// This method will query the database for this information, and then store it in a cache for future requests. + /// + /// a valid connection string for a OracleConnection + /// the name of the stored procedure + /// a bool value indicating whether the return value parameter should be included in the results + /// an array of SqlParameters + public static OracleParameter[] GetSpParameterSet(string connectionString, string spName, bool includeReturnValueParameter) + { + string hashKey = connectionString + ":" + spName + (includeReturnValueParameter ? ":include ReturnValue Parameter" : ""); + + OracleParameter[] cachedParameters; + + cachedParameters = (OracleParameter[])paramCache[hashKey]; + + if (cachedParameters == null) + { + cachedParameters = (OracleParameter[])(paramCache[hashKey] = DiscoverSpParameterSet(connectionString, spName, includeReturnValueParameter)); + } + + return CloneParameters(cachedParameters); + } + + #endregion Parameter Discovery Functions + } +} diff --git a/Utility.cs b/Utility.cs index 1429fd9..4e64d66 100644 --- a/Utility.cs +++ b/Utility.cs @@ -17,6 +17,11 @@ { public class Utility { + public static string DBServer; + public static string Database; + public static string UserID; + public static string DBPassword; + public static void SetBallons(GSOBalloon featureTooltip,GSOBalloonEx balloonEx) { featureTooltip.CacheFilePath = Path.GetDirectoryName(Application.ExecutablePath) + "/GeoScene/Globe/Temp"; diff --git a/bin/x64/Debug/LSPipeline.exe b/bin/x64/Debug/LSPipeline.exe index 833a5e5..76f838b 100644 --- a/bin/x64/Debug/LSPipeline.exe +++ b/bin/x64/Debug/LSPipeline.exe Binary files differ diff --git a/bin/x64/Debug/LSPipeline.pdb b/bin/x64/Debug/LSPipeline.pdb index 245e727..28c81dc 100644 --- a/bin/x64/Debug/LSPipeline.pdb +++ b/bin/x64/Debug/LSPipeline.pdb Binary files differ diff --git a/bin/x64/Debug/databaseConfigOracle.xml b/bin/x64/Debug/databaseConfigOracle.xml index 7e48b08..94be70c 100644 --- a/bin/x64/Debug/databaseConfigOracle.xml +++ b/bin/x64/Debug/databaseConfigOracle.xml @@ -2,7 +2,7 @@ True 192.168.0.203 - szhtdb2 - release - release + eydb2 + scott + scott \ No newline at end of file diff --git a/bin/x64/Debug/log.txt b/bin/x64/Debug/log.txt index 5236cc6..73bcf38 100644 --- a/bin/x64/Debug/log.txt +++ b/bin/x64/Debug/log.txt @@ -27704,3 +27704,75 @@ exception over ------------------------------------------------------------ + + exception begin -----------------2016/12/2 9:55:40--------------------- + + + + e.Message:输入字符串的格式不正确。 + + e.Source:mscorlib + + e.TargetSite:Double ParseDouble(System.String, System.Globalization.NumberStyles, System.Globalization.NumberFormatInfo) + + e.StackTrace: 在 System.Number.ParseDouble(String value, NumberStyles options, NumberFormatInfo numfmt) + 在 System.Double.Parse(String s, IFormatProvider provider) + 在 WorldGIS.CtrlEntitySpaceInfo.positionChanged() 位置 D:\LSPipeline\UserControls\CtrlEntitySpaceInfo.cs:行号 113 + + + + exception over ------------------------------------------------------------ + + exception begin -----------------2016/12/2 9:55:41--------------------- + + + + e.Message:输入字符串的格式不正确。 + + e.Source:mscorlib + + e.TargetSite:Double ParseDouble(System.String, System.Globalization.NumberStyles, System.Globalization.NumberFormatInfo) + + e.StackTrace: 在 System.Number.ParseDouble(String value, NumberStyles options, NumberFormatInfo numfmt) + 在 System.Double.Parse(String s, IFormatProvider provider) + 在 WorldGIS.CtrlEntitySpaceInfo.positionChanged() 位置 D:\LSPipeline\UserControls\CtrlEntitySpaceInfo.cs:行号 115 + + + + exception over ------------------------------------------------------------ + + exception begin -----------------2016/12/2 9:55:55--------------------- + + + + e.Message:输入字符串的格式不正确。 + + e.Source:mscorlib + + e.TargetSite:Double ParseDouble(System.String, System.Globalization.NumberStyles, System.Globalization.NumberFormatInfo) + + e.StackTrace: 在 System.Number.ParseDouble(String value, NumberStyles options, NumberFormatInfo numfmt) + 在 System.Double.Parse(String s, IFormatProvider provider) + 在 WorldGIS.CtrlEntitySpaceInfo.positionChanged() 位置 D:\LSPipeline\UserControls\CtrlEntitySpaceInfo.cs:行号 113 + + + + exception over ------------------------------------------------------------ + + exception begin -----------------2016/12/2 9:55:56--------------------- + + + + e.Message:输入字符串的格式不正确。 + + e.Source:mscorlib + + e.TargetSite:Double ParseDouble(System.String, System.Globalization.NumberStyles, System.Globalization.NumberFormatInfo) + + e.StackTrace: 在 System.Number.ParseDouble(String value, NumberStyles options, NumberFormatInfo numfmt) + 在 System.Double.Parse(String s, IFormatProvider provider) + 在 WorldGIS.CtrlEntitySpaceInfo.positionChanged() 位置 D:\LSPipeline\UserControls\CtrlEntitySpaceInfo.cs:行号 115 + + + + exception over ------------------------------------------------------------ diff --git a/obj/Debug/GenerateResource.read.1.tlog b/obj/Debug/GenerateResource.read.1.tlog index b4c2526..95a0a19 100644 --- a/obj/Debug/GenerateResource.read.1.tlog +++ b/obj/Debug/GenerateResource.read.1.tlog Binary files differ diff --git a/obj/Debug/LSPipeline.exe b/obj/Debug/LSPipeline.exe index 833a5e5..76f838b 100644 --- a/obj/Debug/LSPipeline.exe +++ b/obj/Debug/LSPipeline.exe Binary files differ diff --git a/obj/Debug/LSPipeline.pdb b/obj/Debug/LSPipeline.pdb index 245e727..28c81dc 100644 --- a/obj/Debug/LSPipeline.pdb +++ b/obj/Debug/LSPipeline.pdb Binary files differ