为了账号安全,请及时绑定邮箱和手机立即绑定

C# DBNull.Value 插入 0

C# DBNull.Value 插入 0

C#
慕标5832272 2022-06-12 10:41:10
我正在尝试将数据插入到 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();    }}
查看完整描述

3 回答

?
尚方宝剑之说

TA贡献1788条经验 获得超4个赞

if(Convert.ToString(null) == "")

将被评估为假。

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

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

在旁注中,您应该使用 SqlParameters 而不是在字符串中附加值。


查看完整回答
反对 回复 2022-06-12
?
守着星空守着你

TA贡献1799条经验 获得超8个赞

您需要确保您的数据库列结构包含NULL您实际需要的类型。还要确保您没有设置任何默认约束,它会自动将列赋值为何0null分配。



查看完整回答
反对 回复 2022-06-12
?
汪汪一只猫

TA贡献1898条经验 获得超8个赞

这可能看起来有点笨拙和臃肿,但如果你使用参数(你真的,真的应该),我有一个我在项目中使用的扩展方法来获取任何命令对象并循环遍历参数以将 .NET null进入 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;


查看完整回答
反对 回复 2022-06-12
  • 3 回答
  • 0 关注
  • 163 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信