如何在不使用参数的情况下在C#中向数据库插入空值?

时间:2016-05-09 05:15:58

标签: c# sql sql-server

使用SQL参数,我可以使用这种C#代码向数据库插入NULL值:

string query = "INSERT INTO table_name (column_name) VALUES (@value)";
using (SqlConnection connection = new SqlConnection(/* connection info */))
{
    using (SqlCommand command = new SqlCommand(query, connection))
    {
        command.Parameters.Add("@value", DBNull.Value);
        command.ExecuteNonQuery();
    }
}

由于SQL-Injection和其他一些原因,不使用参数通常被认为是不好的做法。但是,我很想知道是否有办法在不使用它们的情况下这样做。像这样:

var nullValue = DBNull.value;
string query = "INSERT INTO table_name (column_name) VALUES (" + nullValue + ")";

甚至:

string query = "INSERT INTO table_name (column_name) VALUES (\\NULL\\)"; 

或其他什么。感谢。

2 个答案:

答案 0 :(得分:5)

是的,是的。你可以这样做,如果你确定该列应该总是为NULL,那么你可以简单地用完整的字符串编写SQL语句,就像这样。

string query = "INSERT INTO table_name (column_name) VALUES (NULL)";

如果您从用户那里获取输入,那么从不这样做,这正是您注入的方式。

var nullValue = DBNull.value;
string query = "INSERT INTO table_name (column_name) VALUES (" + nullValue + ")";

如果nullValue包含类似字符串NULL); DROP TABLE table_name的内容,则会发生注入。 NULL);刚刚完成您自己的SQL,允许更多的SQL代码对您的数据造成严重破坏。

Web开发的第一条规则。永远不要信任用户数据。使用参数。

using(SqlConnection connection = new SqlConnection("connection_String"))
{
    string query = "INSERT INTO table_name (column_name) VALUES (@val1)";

    using(SqlCommand inputQuery = new SqlCommand(query))
    {
        inputQuery.Connection = openCon;
        inputQuery.Parameters.AddWithValue("@val1", DBNull.Value);
        try
        {
            connection.Open();
            int recordsAffected = inputQuery.ExecuteNonQuery();
        }
        catch(SqlException)
        {
            // error here
        }
        finally
        {
            connection.Close();
        }
    }
}

答案 1 :(得分:2)

请试试这个..

command.Parameters.AddWithValue(
"@ProductName",
// this requires a cast as ?: must return the same type
String.IsNullOrWhiteSpace(productName)
    ? (object)DBNull.Value
    : (object)productName
);