SQL_ExecuteNonQuery()

您可以使用 ExecuteNonQuery 来执行目录操作(例如查询数据库的结构或创建表等数据库对象)

或通过执行 UPDATE、INSERT 或 DELETE 语句,在不使用 DataSet 的情况下更改数据库中的数据。
虽然 ExecuteNonQuery 不返回任何行,但映射到参数的任何输出参数或返回值都会用数据进行填充。
对于 UPDATE、INSERT 和 DELETE 语句,返回值为该命令所影响的行数。对于所有其他类型的语句,返回值为 -1。

如果发生回滚,返回值也为 -1。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
优化这串代码using Oracle.ManagedDataAccess.Client; public static OracleDbType ConvertOracleDbType(Type type) { switch(type.Name.ToLower()) { case "decimal": return OracleDbType.Decimal; case "string": return OracleDbType.Varchar2; case "datetime": return OracleDbType.Date; default: return OracleDbType.Varchar2; } } public static dynamic InitList(Type type) { switch(type.Name.ToLower()) { case "decimal": return new List<decimal>(); case "string": return new List<string>(); case "datetime": return new List<DateTime>(); default: return new List<string>(); } } public static void AddValue(dynamic list, Type type, object value) { switch(type.Name.ToLower()) { case "decimal": list.Add(Convert.ToDecimal(value)); break; case "string": list.Add(Convert.ToString(value)); break; case "datetime": list.Add(Convert.ToDateTime(value)); break; default: list.Add(Convert.ToString(value)); break; } } public static int BulkCopy(DataTable dataTable) { string connStr = ""; int result = 0; List<string> sql_column = new List<string>(); List<string> sql_para = new List<string>(); List<OracleParameter> paras = new List<OracleParameter>(); foreach(DataColumn column in dataTable.Columns) { sql_column.Add(column.ColumnName); sql_para.Add(":" + column.ColumnName); dynamic list = InitList(column.DataType); foreach(DataRow dr in dataTable.Rows) { AddValue(list, column.DataType, dr[column]); } OracleParameter para = new OracleParameter(column.ColumnName, ConvertOracleDbType(column.DataType)); para.Value = list.ToArray(); paras.Add(para); } using(var connection = new OracleConnection(connStr)) { connection.Open(); string sql = $"insert into {dataTable.TableName}({string.Join(",", sql_column)}) values ({string.Join(",", sql_para)})"; OracleCommand cmd = new OracleCommand(sql, connection); cmd.Parameters.AddRange(paras.ToArray()); cmd.ArrayBindCount = dataTable.Rows.Count; result = cmd.ExecuteNonQuery(); connection.Close(); } return result; }
最新发布
06-02
以下是可以优化的几点: 1. 在每个方法内部都使用了 switch 语句,可以将其封装成一个字典,避免每次都进行判断。 2. InitList 方法中每个 case 的返回值类型都是相同的,可以直接将返回值类型写在方法签名中,避免使用 dynamic。 3. 在 AddValue 方法中,default 分支中的类型应该与 InitList 方法中的对应类型一致。 4. 在 BulkCopy 方法中,使用了多个 List 来存储数据,可以考虑使用字典或者自定义的类来存储,使代码更加简洁易懂。 5. 连接字符串 connStr 并没有赋值,需要在实际应用中进行赋值。 6. 在 using 语句中打开了连接,在执行完 SQL 后应该使用 using 语句自动关闭连接,避免出现连接泄露的问题。 优化后的代码如下: ``` using Oracle.ManagedDataAccess.Client; public static class OracleHelper { private static readonly Dictionary<string, OracleDbType> TypeDict = new Dictionary<string, OracleDbType>() { {"decimal", OracleDbType.Decimal}, {"string", OracleDbType.Varchar2}, {"datetime", OracleDbType.Date} }; public static OracleDbType ConvertOracleDbType(Type type) { string typeName = type.Name.ToLower(); return TypeDict.ContainsKey(typeName) ? TypeDict[typeName] : OracleDbType.Varchar2; } public static List<T> InitList<T>() { if (typeof(T) == typeof(decimal)) { return new List<T>() as List<T>; } else if (typeof(T) == typeof(string)) { return new List<T>() as List<T>; } else if (typeof(T) == typeof(DateTime)) { return new List<T>() as List<T>; } else { return new List<T>() as List<T>; } } public static void AddValue<T>(List<T> list, object value) { if (typeof(T) == typeof(decimal)) { list.Add(Convert.ToDecimal(value)); } else if (typeof(T) == typeof(string)) { list.Add(Convert.ToString(value)); } else if (typeof(T) == typeof(DateTime)) { list.Add(Convert.ToDateTime(value)); } else { list.Add(Convert.ToString(value) as T); } } public static int BulkCopy(DataTable dataTable) { string connStr = ""; // 这里需要替换为实际的连接字符串 int result = 0; List<string> sql_column = new List<string>(); List<string> sql_para = new List<string>(); Dictionary<string, List<object>> dataDict = new Dictionary<string, List<object>>(); foreach (DataColumn column in dataTable.Columns) { sql_column.Add(column.ColumnName); sql_para.Add(":" + column.ColumnName); List<object> list = InitList<object>(); foreach (DataRow dr in dataTable.Rows) { AddValue(list, dr[column]); } dataDict.Add(column.ColumnName, list); } using (var connection = new OracleConnection(connStr)) { connection.Open(); string sql = $"insert into {dataTable.TableName}({string.Join(",", sql_column)}) values ({string.Join(",", sql_para)})"; OracleCommand cmd = new OracleCommand(sql, connection); foreach (var kvp in dataDict) { OracleParameter para = new OracleParameter(kvp.Key, ConvertOracleDbType(dataTable.Columns[kvp.Key].DataType)); para.Value = kvp.Value.ToArray(); cmd.Parameters.Add(para); } cmd.ArrayBindCount = dataTable.Rows.Count; result = cmd.ExecuteNonQuery(); } return result; } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值