C # DBNull.Value Вставка 0 - PullRequest
       100

C # DBNull.Value Вставка 0

0 голосов
/ 12 декабря 2018

Я пытаюсь вставить данные в таблицу 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 ]

0 голосов
/ 12 декабря 2018
if(Convert.ToString(null) == "")

будет оцениваться как ложное.

, поэтому приведенный ниже код не будет выполнен

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

в примечании, вы должны использовать SqlParameters вместо добавления значений встрока.

0 голосов
/ 13 декабря 2018

Это может показаться немного сложным и ненадежным, но если вы используете параметры (и вы действительно, действительно должны), у меня есть метод расширения, который я использую в своем проекте, чтобы взять любой объект команды и перебрать параметры, чтобы повернуть.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;
0 голосов
/ 12 декабря 2018

Вы должны убедиться, что структура столбцов вашей базы данных содержит NULL типов, которые вам действительно нужны.Также убедитесь, что у вас не установлены никакие ограничения по умолчанию, что автоматически присваивает столбцам значение 0, когда назначается null.

...