我是C#和sql的新手。我在c#中有一个函数,它在数据库表中搜索特定的记录 我的功能是
public string returnstudentdata(string primarykey, string table, string regno, string column)
{
string temp = "";
if (conn.State == ConnectionState.Closed)
{
conn.Open();
}
SqlCommand newCmd = conn.CreateCommand();
newCmd.Connection = conn;
newCmd.CommandType = CommandType.Text;
newCmd.CommandText = "SELECT" + column + "FROM" + table + "WHERE" + primarykey + "=" + regno + "";
SqlDataReader dr = newCmd.ExecuteReader();
while (dr.Read())
{
temp = dr[column].ToString();
}
dr.Close();
conn.Close();
return temp;
}
此代码正确执行,但涉及到SqlDataReader dr = newCmd.ExecuteReader();它引发了一个例外陈述:
System.Data.dll中出现未处理的“System.Data.SqlClient.SqlException”类型异常
其他信息:'='附近的语法不正确。
调用语句是
string regno = txtRegNo.Text;
txtFName.Text = update.returnstudentdata("Regno","student",regno,"Fname");
我的code.please帮助
有什么问题答案 0 :(得分:3)
至少在sql语句中需要空格:
newCmd.CommandText = "SELECT " + column + " FROM " + table + " WHERE " + primarykey + "=" + regno + "";
答案 1 :(得分:2)
在引号内的SQL关键字周围添加一些空格,您的字符串不会产生有效的SQL代码:
newCmd.CommandText = "SELECT " + column + " FROM " + table + " WHERE " + primarykey + "=" + regno + "";
另外,出于安全考虑,我建议使用参数化查询而不是自组装字符串。例如,您的代码容易受到SQL注入攻击。
有关更多说明,请参阅此SO主题:How do parameterized queries help against SQL injection?
答案 2 :(得分:1)
此行不会提供有效的SQL。没有空格.-
newCmd.CommandText = "SELECT" + column + "FROM" + table + "WHERE" + primarykey + "=" + regno + "";
答案 3 :(得分:1)
试试这个:
newCmd.CommandText = "SELECT " + column + " FROM " + table + " WHERE " + primarykey + " = '" + regno + "'";
答案 4 :(得分:1)
您的CommandText
或Sql查询可能会出现很多错误。
首先,SQL关键字(如SELECT
)和变量(假设变量未填充空格)之间没有空格:
newCmd.CommandText = "SELECT" + column + "FROM" + table + "WHERE" + primarykey + "=" + regno + "";
您应该首先添加如下空格:
newCmd.CommandText = "SELECT " + column + " FROM " + table + " WHERE " + primarykey + "=" + regno + "";
第二个问题是,您没有用引号括起regno
值。现在,这可能是有效的,因为值是数字;如果是这种情况,你可以忽略引号,你的查询应该执行正常(添加上面提到的空格后)。但是,如果它是一个字符串,您需要将值包装在这样的引号中:
newCmd.CommandText = "SELECT " + column + " FROM " + table + " WHERE " + primarykey + "=\"" + regno + "\"";
但是,无论值是数字还是字符串,我实际上建议您使用预准备语句。您可以通过以下方式完成此任务:
newCmd.CommandText = "SELECT " + column + " FROM " + table + " WHERE " + primarykey + "=@regNo";
newCmd.Parameters.AddWithValue("@regNo", regno);
准备好的语句将有助于减少记住将值包装在引号中的需要(它将为您处理),并通过帮助防止SQL注入来增加查询的安全性。