1

我是 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");

我的代码有什么问题。请帮忙

4

5 回答 5

3

至少您的 sql 语句中需要空格:

newCmd.CommandText = "SELECT " + column + " FROM " + table + " WHERE " + primarykey + "=" + regno + "";
于 2013-01-09T15:34:55.650 回答
2

在引号内的 SQL 关键字周围放置一些空格,您的字符串不会生成有效的 SQL 代码:

newCmd.CommandText = "SELECT " + column + " FROM " + table + " WHERE " + primarykey + "=" + regno + "";

此外,出于安全原因,我建议使用参数化查询而不是自组装字符串。您的代码容易受到例如 SQL 注入攻击。

有关更多解释,请参阅此 SO 线程:参数化查询如何帮助防止 SQL 注入?

于 2013-01-09T15:35:22.880 回答
1

此行不会给出有效的 SQL。没有空间。-

newCmd.CommandText = "SELECT" + column + "FROM" + table + "WHERE" + primarykey + "=" + regno + "";
于 2013-01-09T15:35:11.100 回答
1

试试这个:

newCmd.CommandText = "SELECT " + column + " FROM " + table + " WHERE " + primarykey + " = '" + regno + "'";
于 2013-01-09T15:36:36.797 回答
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 注入来增加查询的安全性。

于 2013-01-09T15:36:51.413 回答