【发布时间】:2019-02-13 18:22:55
【问题描述】:
我正在尝试将数据插入到我的数据库中。我找不到任何原因为什么我的受影响结果为 0,并且它不断崩溃,让我在我的 cmd.ExecuteNonQuery() 上出现一个很大的波浪,它说'('附近有一个不正确的语法。所以我仔细分析了我的过去一个小时的sql语句,我不太确定问题出在哪里。
private int SendData(string sqlStatement)
{
SqlConnection conn = new SqlConnection(Properties.Settings.Default.cnnString);
SqlCommand cmd = new SqlCommand(sqlStatement, conn);
int AffectedRecords = 0;
using (conn)
{
conn.Open();
AffectedRecords = cmd.ExecuteNonQuery();
conn.Close();
}
return AffectedRecords;
}
private void InsertData()
{
string sql = string.Format("INSERT INTO Participant (LastName, FirstName, " + ("Country, Gender, IACMember, Rank, SponsorId" +
"VALUES (\'{0}\',\'{1}\',\'{2}\',\'{3}\','{4}',{5}, {6})"),
txtLastName.Text, txtFirstName.Text, cboCountry.SelectedItem, Gender(gender),
(chkMember.Checked), ((txtRank.Text == string.Empty) ? "Null" : txtRank.Text),
((cboSponsor.Text == "No Sponsor") ? "Null" : cboSponsor.SelectedValue));
SendData(sql);
}
【问题讨论】:
-
字段列表后缺少右括号,单引号前无需加\。但永远不要以这种方式编写 sql 命令。这是对周围任何想成为黑客的公开邀请。使用 Sql Injection 破解你的程序很容易
-
如果您使用参数化 SQL,您将能够更清楚地看到问题 - 并且您的应用不会受到 SQL 注入的攻击。
-
@stuartd 你在说 command.Parameters.Add("@name", txtName.text);
-
@NickNickerson 就是这样,是的。
-
.. 然后声明变为
var sql = "INSERT INTO Participant (LastName, FirstName, Country, Gender, IACMember, Rank, SponsorId VALUES (@LastName, @FirstName, @Country, @Gender, @IACMember, @Rank, @SponsorId)";,这使得更容易看到问题,并且您不必担心将Robert'); DROP TABLE Participant ;--作为您的值之一。