C# 我错过了什么?我能';我不明白为什么要添加额外的'';System.Data.SqlClient.SqlException:';靠近'的语法不正确;76231''; private void按钮添加并单击(对象发送者,事件参数e) { String FirstName=textBoxFirstName.Text; 字符串LastName=textBoxLastName.Text; 字符串PhoneNumber=textBoxPhone.Text; 字符串Email=textBoxEmail.Text; DateTime Birthday=DateBirthday.Value; String Street=textBoxStreet.Text; 字符串City=textBoxCity.Text; 字符串状态=textBoxState.Text; 字符串Zipcode=textBoxZipcode.Text; 如果( 名字=“”|| LastName==“”|| 电话号码=“”|| 电子邮件==“” ) { MessageBox.Show(“带“*”的字段不能为空”); } 其他的 { SqlConnection con=newsqlconnection(“数据源=SER\\SQLEXPRESS;初始目录=sunshinegrase;集成安全性=True”); con.Open(); SqlCommand cmd=新的SqlCommand(@“插入客户” 值(“+FirstName+”、“+LastName+”、“+PhoneNumber+”、“+Email+”、“+birth+”、“+Street+”、“+City+”、“+State+”、“+Zipcode+”、con); cmd.ExecuteNonQuery(); con.Close(); MessageBox.Show(“客户添加!”); } }

C# 我错过了什么?我能';我不明白为什么要添加额外的'';System.Data.SqlClient.SqlException:';靠近'的语法不正确;76231''; private void按钮添加并单击(对象发送者,事件参数e) { String FirstName=textBoxFirstName.Text; 字符串LastName=textBoxLastName.Text; 字符串PhoneNumber=textBoxPhone.Text; 字符串Email=textBoxEmail.Text; DateTime Birthday=DateBirthday.Value; String Street=textBoxStreet.Text; 字符串City=textBoxCity.Text; 字符串状态=textBoxState.Text; 字符串Zipcode=textBoxZipcode.Text; 如果( 名字=“”|| LastName==“”|| 电话号码=“”|| 电子邮件==“” ) { MessageBox.Show(“带“*”的字段不能为空”); } 其他的 { SqlConnection con=newsqlconnection(“数据源=SER\\SQLEXPRESS;初始目录=sunshinegrase;集成安全性=True”); con.Open(); SqlCommand cmd=新的SqlCommand(@“插入客户” 值(“+FirstName+”、“+LastName+”、“+PhoneNumber+”、“+Email+”、“+birth+”、“+Street+”、“+City+”、“+State+”、“+Zipcode+”、con); cmd.ExecuteNonQuery(); con.Close(); MessageBox.Show(“客户添加!”); } },c#,sql-server,visual-studio,C#,Sql Server,Visual Studio,我试图创建一个程序,在我的SQL数据库中添加一列,但我不明白为什么会出现此错误。我尝试了许多不同的方法重新格式化insert命令,并将dateime更改为文本框,但它仍然会抛出相同的错误消息。你真的应该永远不要像这样编写SQL代码就是这样!它让你对SQL注入敞开了大门,SQL注入是存在的#1漏洞。现在停止这样做吧 相反,使用适当参数化的SQL查询,并养成将一次性对象(如SqlConnection和SqlCommand)放入适当的中的习惯,使用(){..}代码块以确保正确处理 所以你的代码应该是这

我试图创建一个程序,在我的SQL数据库中添加一列,但我不明白为什么会出现此错误。我尝试了许多不同的方法重新格式化insert命令,并将dateime更改为文本框,但它仍然会抛出相同的错误消息。

你真的应该永远不要像这样编写SQL代码就是这样!它让你对SQL注入敞开了大门,SQL注入是存在的#1漏洞。现在停止这样做吧

相反,使用适当参数化的SQL查询,并养成将一次性对象(如
SqlConnection
SqlCommand
)放入适当的
中的习惯,使用(){..}
代码块以确保正确处理

所以你的代码应该是这样的:

// define your INSERT query and use proper list of columns in the table you're inserting into
string query = @"INSERT INTO Customers(FirstName, LastName, PhoneNumber, Email, Birthday, Street, City, State, Zipcode)
                 VALUES(@FirstName, @LastName, @PhoneNumber, @Email, @Birthday, @Street, @City, @State, @Zipcode);";

// put connection and command objects into using blocks 
using (SqlConnection con = new SqlConnection("Data Source=SER\\SQLEXPRESS;Initial Catalog=SunshineGrace;Integrated Security=True"))
using (SqlCommand cmd = new SqlCommand (query, con))
{
    // define parameters, with their most appropriate data type, and set their values
    cmd.Parameters.Add("@FirstName", SqlDbType.VarChar, 100).Value = FirstName;
    cmd.Parameters.Add("@LastName", SqlDbType.VarChar, 100).Value = LastName;
    cmd.Parameters.Add("@PhoneNumber", SqlDbType.VarChar, 50).Value = PhoneNumber;
    cmd.Parameters.Add("@Email", SqlDbType.VarChar, 255).Value = Email;
    cmd.Parameters.Add("@Birthday", SqlDbType.Date).Value = Birthday;
    cmd.Parameters.Add("@Street", SqlDbType.VarChar, 100).Value = Street;
    cmd.Parameters.Add("@City", SqlDbType.VarChar, 100).Value = City;
    cmd.Parameters.Add("@State", SqlDbType.VarChar, 100).Value = State;
    cmd.Parameters.Add("@Zipcode", SqlDbType.VarChar, 20).Value = Zipcode;
    
    con.Open();
    cmd.ExecuteNonQuery();
    con.Close();

    MessageBox.Show("Customer added");
} 

使用此代码方法不仅可以可靠地消除任何SQL注入风险,还可以防止任何错误在SQL语句中出现过多或过少的单引号等。始终这样做是一种很好的做法。

-您不应该将SQL语句串联在一起-使用参数化查询来避免SQL注入ion-签出同意@marc_关于SQL注入的意见。但您也忘记了关闭“)"月底,command@Quercus..哪一个OP可以更快更容易地发现参数化查询的可读性得到改善尝试将姓氏作为
O'Leary
输入,以查看代码上线时遇到的第一个问题..并停止不为INSERT语句指定列列表的懒惰坏习惯。不确定为什么您需要客户的生日(而不是日期),因为这是PII,但生日是日期,而不是日期时间。