![](/img/trans.png)
[英]C# MySqlCommand parameter with value of DBNull.Value not working
[英]C# DBNull.Value Inserting 0
我正在尝试将数据插入SQL表中。 我遇到的数据类型是可空的浮点数。 插入NULL值后,它们将变为0。如何保持NULL。
private void InsertStatisticsData(DataTable dt)
{
//check isin periodicity and As of Date
foreach(DataRow row in dt.Rows)
{
DataTable queryResultTable = SQL.Query($@"SELECT * FROM Statistics
WHERE [CodeID] = '{row["CodeID"]}'
AND [Periodicity] = '{row["Periodicity"]}'
AND [As of Date] = '{row["As of Date"]}'");
if(queryResultTable.Rows.Count == 0)
{
//Check for Null Values
for(int i = 0; i < row.ItemArray.Count(); i++)
{
if (Convert.ToString(row[i]) == "")
row[i] = (object)DBNull.Value;
}
//Insert Data Into DataBase
SQL.NonQuery($@"INSERT INTO Statistics
VALUES ('{row["CodeID"]}' ,
'{row["Volatility"]}',
'{row["Beta"]}',
'{row["Info Ratio"]}',
'{row["Tracking"]}',
'{row["Drawdown"]}',
'{row["Periodicity"]}',
'{row["As of Date"]}')");
}
}
}
非查询功能:
public static void NonQuery(string query, string databaseName = "Database", string serverAddress = "server-name", int commandTimeout = 30)
{
string connString = $"Server = {serverAddress}; Database = {databaseName}; Trusted_Connection = True";
using (SqlConnection sqlConn = new SqlConnection(connString))
using (SqlCommand cmd = new SqlCommand(query, sqlConn))
{
sqlConn.Open();
cmd.CommandTimeout = commandTimeout;
cmd.ExecuteNonQuery();
}
}
您需要确保您的数据库列结构在实际需要的地方包含NULL
类型。 还要确保没有设置任何默认约束,当分配null
值时,默认约束将自动将列的值设置为0
。
if(Convert.ToString(null) == "")
将被评估为假。
所以下面的代码将不会执行
row[i] = (object)DBNull.Value;
附带说明,您应该使用SqlParameters而不是在字符串中附加值。
这似乎有点笨拙和肿,但是如果您使用参数(并且确实应该使用),那么我在我的项目中使用了一种扩展方法来获取任何命令对象并遍历参数以将.NET空到DbNull:
private static void ProcessNullParameters(this DbCommand command)
{
foreach (DbParameter param in command.Parameters)
{
if (param.Value == null)
param.Value = DBNull.Value;
}
}
这样,如果您的本机对象返回空值,则可以针对命令对象调用扩展方法。 我无法确定您的示例中的SQL
对象是什么(某种类型的框架?),但是大概在幕后某个地方会发生这种情况:
SqlCommand cmd = new SqlCommand("insert into Statistics values (@Code, @Volatility)", conn);
cmd.Parameters.Add("@Code", SqlDbType.VarChar);
cmd.Parameters.Add("@Volatility", SqlDbType.Decimal);
foreach (DataRow dr in dt.Rows)
{
cmd.Parameters[0].Value = dr["Code"];
cmd.Parameters[1].Value = dr["Volatility"];
// And here you convert your nulls to DbNull
cmd.ProcessNullParameters();
cmd.ExecuteNonQuery();
}
替代方法是对每个可为空的值声明执行此操作。
cmd.Parameters[0].Value = dr["Code"] ?? DbNull.Value
cmd.Parameters[1].Value = dr["Volatility"] ?? DbNull.Value;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.