C#DBNull.值正在插入0



我正在尝试将数据插入SQL表中。我遇到问题的数据类型是可为null的浮点值。当插入NULL值时,它们将变为0。我怎样才能保持它们为空。

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) == "")

将被评估为false。

所以下面的代码不会被执行

row[i] = (object)DBNull.Value; 

附带说明一下,应该使用SqlParameters,而不是在字符串中附加值。

这可能看起来有点过于严厉和夸张,但如果你使用参数(你真的,真的应该这样做(,我在我的项目中使用了一个扩展方法来获取任何命令对象,并在参数中循环以转为a。NET null转换为DbNull:

private static void ProcessNullParameters(this DbCommand command)
{
foreach (DbParameter param in command.Parameters)
{
if (param.Value == null)
param.Value = DBNull.Value;
}
}

这样,如果本机对象返回null值,则可以针对命令对象调用extension方法。我不知道你的例子中的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();
}

另一种选择是对每个可以为null的值声明执行此操作。

cmd.Parameters[0].Value = dr["Code"] ?? DbNull.Value
cmd.Parameters[1].Value = dr["Volatility"] ?? DbNull.Value;

相关内容

  • 没有找到相关文章