我试图在一个名为“processed”的字段中写入一个bit值(true或false)到我的数据库中。我目前正在尝试通过传入bool值来实现这一点,但我得到一个错误,说不能从类型varchar转换为bit。有人能看到我的逻辑中发生了什么吗?
protected void CheckBoxProcess_CheckedChanged(object sender, EventArgs e)
{
bool update;
bool trueBool = true;
bool falseBool = false;
string checkedString = "UPDATE SecureOrders SET processed = '%" + trueBool + "%' WHERE fName LIKE '%" + DefaultGrid.SelectedRow.Cells[2].Text + "%' AND lName LIKE '% " + DefaultGrid.SelectedRow.Cells[3].Text + "%'";
string uncheckedString = "UPDATE SecureOrders SET processed = '%" + falseBool + "%' WHERE fName LIKE '%" + DefaultGrid.SelectedRow.Cells[2].Text + "%' AND lName LIKE '% " + DefaultGrid.SelectedRow.Cells[3].Text + "%'";
CheckBox cb = (CheckBox)sender;
GridViewRow gvr = (GridViewRow)cb.Parent.Parent;
DefaultGrid.SelectedIndex = gvr.RowIndex;
update = Convert.ToBoolean(DefaultGrid.SelectedValue);
orderByString = orderByList.SelectedItem.Value;
fieldString = searchTextBox.Text;
System.Configuration.ConnectionStringSettings connectionString;
connectionString = rootWebConfig.ConnectionStrings.ConnectionStrings["secureodb"];
// Create an SqlConnection to the database.
using (SqlConnection connection = new SqlConnection(connectionString.ToString()))
{
connection.Open();
SqlCommand checkedCmd = new SqlCommand(checkedString, connection);
SqlCommand uncheckedCmd = new SqlCommand(uncheckedString, connection);
dataAdapter = new SqlDataAdapter("SELECT * FROM SecureOrders", connection);
// create the DataSet
dataSet = new DataSet();
// fill the DataSet using our DataAdapter
dataAdapter.Fill(dataSet, "SecureOrders");
DataView source = new DataView(dataSet.Tables[0]);
DefaultGrid.DataSource = source;
if (cb.Checked == true)
{
checkedCmd.ExecuteNonQuery();
}
else
{
uncheckedCmd.ExecuteNonQuery();
}
connection.Close();
}
}
字符串
8条答案
按热度按时间kse8i1jr1#
您需要将位字段设置为
1
或0
,具体取决于它是真还是假。于是:
字符串
此外,正如在评论中提到的,直接从用户输入构造SQL语句是成为SQL注入攻击受害者的最简单方法。在这些情况下,最好使用参数化查询(甚至是存储过程)。
型
然后,您可以创建传递给
ExecuteNonQuery
调用的参数型
okxuctiv2#
如果你在SQL语句中注入字符串“1”表示True,“0”表示False,你就可以解决这个问题,解决这个问题的“正确”方法是参数化你的SQL语句,并将参数添加到命令对象中。然后由框架完成从VB
Boolean
到SqlDbType.Bit
的类型转换。试试看:
字符串
还有:
型
最后:
型
如果你打算编写数据驱动的Web应用程序,那么了解如何避免SQL注入安全漏洞是非常重要的。有关更多信息,请访问:MSDN How To: Protect From SQL Injection in ASP.NET
qoefvg9y3#
在SQL中,位值是1或0,而不是“true”或“false”。在更新中将“true”和“false”更改为1和0,应该没问题。(注意0和1也没有引号。)
gk7wooem4#
你的SQL语法是错误的-你传递了一个字符串作为值来设置
processed
列的值,这是你不能做的。r9f1avp55#
最简单的方法是将布尔值Convert.ToInt16转换为true/false,0或1。
jm81lzqq6#
布尔值被连接为“true”|“false”。尝试使用三元运算符来显示“1”或“0”:
字符串
new9mtju7#
您的SQL语句并没有试图设置任何类型的布尔值,而是试图设置文本
%True%
或%False%
。由于您将数据库字段描述为“bit”而不是“boolean”,因此在构造字符串时可能需要使用类似
"processed = " + (trueBool ? 1 : 0) + "
的东西。但根据您使用的SQL服务器,您可能可以使用类似processed = " + trueBool + "
或processed = '" + trueBool + "'
的东西。或者,在这种特殊情况下,您可以跳过插值
trueBool
,而只是使用一个完全常数的字符串,就像大多数其他答案所建议的那样。另外,顺便说一句,请注意,通过在SQL语句中插入未经检查的用户输入,您将为错误和SQL注入敞开大门。例如,如果有人输入“O'Brian”作为姓氏,您将获得错误,并且使用更多恶意的值选择,他们可能能够更改数据库中的任何内容。
chy5wohz8#
很老的问题,但我希望这可以帮助别人。
要从C#代码隐藏中向SQL数据库写入位值,请遵循以下示例。
1.-首先声明一个变量以获取值0或1(在本例中,它取决于Checkbox1的状态):
字符串
2.-然后创建你的连接,你的SQL查询并执行它:
型
请注意,在SQL Server命令中,必须将int变量(isenable)转换为int 16,以避免在执行命令时出错。