使用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\\)";
或其他什么。感谢。
答案 0 :(得分:5)
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
);