当我将测试1键入sNtxtbox时,我看到了以下错误。任何帮助将不胜感激
' 1'
附近的语法不正确private void flexOpen_Click(object sender, RoutedEventArgs e)
{
using (SqlConnection sqlConSN = new SqlConnection(SNconnectionstring))
{
sqlConSN.Open();
String sqlSelectQuerySN = ("Select * FROM tblSN WHERE SerialNumber = " + sNtxtbox.Text);
SqlCommand sqlCmdSNLoad = new SqlCommand(sqlSelectQuerySN, sqlConSN);
SqlDataReader drSNReader = sqlCmdSNLoad.ExecuteReader();
if (drSNReader.Read())
{
SNtest1.Text = (drSNReader["Test1"].ToString());
SNtest2.Text = (drSNReader["Test2"].ToString());
SNtest3.Text = (drSNReader["Test3"].ToString());
SNtest4.Text = (drSNReader["Test4"].ToString());
SNtest5.Text = (drSNReader["Test5"].ToString());
SNtest6.Text = (drSNReader["Test6"].ToString());
SNtest7.Text = (drSNReader["Test7"].ToString());
SNtest8.Text = (drSNReader["Test8"].ToString());
答案 0 :(得分:2)
假设您的数据库字段是一个字符串,您应该像这样重写代码:
String sqlSelectQuerySN = ("Select * FROM tblSN WHERE SerialNumber = @serialNumber");
SqlCommand sqlCmdSNLoad = new SqlCommand(sqlSelectQuerySN, sqlConSN);
sqlCmdSNLoad.Parameters.Add("@serialNumber", System.Data.SqlDbType.VarChar, 255).Value = sNtxtbox.Text;
请注意,您应该使用数据库字段类型替换VarChar
。我假设您使用的是VarChar
。例如,如果您使用NVarChar
,则应更改它以反映您的数据库架构。另外,将255
替换为VarChar的长度。
你没有需要来传递长度,但是不传递长度意味着.NET会假设数据库字段的长度与你传递的长度相同。因此,SQL服务器将看到序列号长度为5的查询,与序列号长度为6的查询不同,因为它们将分别作为VarChar(5)
和VarChar(6)
传递。每个都有自己的执行计划,这意味着它无法利用缓存来加速查询。有关详细信息,请参阅here和here。
这将解决您的问题,并且还可以通过使用参数化查询来保护您免受SQL注入。
答案 1 :(得分:1)
替换此
String sqlSelectQuerySN = ("Select * FROM tblSN WHERE SerialNumber = " + sNtxtbox.Text);
对此:
SqlCommand sqlcmd = ("Select * FROM tblSN WHERE SerialNumber=@SerialNumber",sqlConSN);
sqlcmd.Parameters.AddWithValue("@SerialNumber",sNtxtbox.Text);
答案 2 :(得分:-1)
String sqlSelectQuerySN = "Select * FROM tblSN WHERE SerialNumber = '" + sNtxtbox.Text + "'";
但我建议您使用上面列出的参数..