C# DBNull.Value 插入 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();

    }

}


慕标5832272
浏览 206回答 3
3回答

尚方宝剑之说

if(Convert.ToString(null)&nbsp;==&nbsp;"")将被评估为假。所以下面的代码不会被执行row[i]&nbsp;=&nbsp;(object)DBNull.Value;在旁注中,您应该使用 SqlParameters 而不是在字符串中附加值。

守着星空守着你

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

汪汪一只猫

这可能看起来有点笨拙和臃肿,但如果你使用参数(你真的,真的应该),我有一个我在项目中使用的扩展方法来获取任何命令对象并循环遍历参数以将 .NET null进入 DbNull:private static void ProcessNullParameters(this DbCommand command){&nbsp; &nbsp; foreach (DbParameter param in command.Parameters)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; if (param.Value == null)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; param.Value = DBNull.Value;&nbsp; &nbsp; }}这样,如果您的本机对象返回空值,您可以针对命令对象调用扩展方法。我不知道您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){&nbsp; &nbsp; cmd.Parameters[0].Value = dr["Code"];&nbsp; &nbsp; cmd.Parameters[1].Value = dr["Volatility"];&nbsp; &nbsp; // And here you convert your nulls to DbNull&nbsp; &nbsp; cmd.ProcessNullParameters();&nbsp; &nbsp; cmd.ExecuteNonQuery();}另一种方法是对每个可为空的值声明执行此操作。cmd.Parameters[0].Value = dr["Code"] ?? DbNull.Valuecmd.Parameters[1].Value = dr["Volatility"] ?? DbNull.Value;
打开App,查看更多内容
随时随地看视频慕课网APP