'='附近的语法不正确。在代码c#中

时间:2016-09-20 18:35:05

标签: c# sql

我正在开发ac#windows表单应用程序,它保存了关于学生的信息,如名称课程年份等。我保存到sql数据库的代码可以工作但是当涉及到retreiving信息时我得到这些错误不正确的语法附近'='。我认为错误是在retreive code.please help:)

这是检索代码:

try
{
    string sql = "SELECT studnum,course,f_name,l_name,color_image FROM table3 WHERE f_name=" + textBoxfname.Text + "";
    if (conn.State != ConnectionState.Open)
        conn.Open();
    command = new SqlCommand(sql, conn);
    SqlDataReader reader = command.ExecuteReader();
    reader.Read();
    if (reader.HasRows)
    {
        labeloutputstudnum.Text = reader[0].ToString();
        labeloutputcourse.Text = reader[1].ToString();
        labeloutputfname.Text = reader[2].ToString();
        labeloutputlname.Text = reader[3].ToString();
        byte[] img = (byte[])(reader[4]);
        if (img == null)
            pictureBox3.Image = null;
        else
        {
            MemoryStream ms = new MemoryStream(img);
            pictureBox3.Image = Image.FromStream(ms);
        }
    }
    else
    {
        textBoxstudno.Text = "";
        textBoxcourse.Text = "";
        textBoxfname.Text = "";
        textBoxlname.Text = "";
        pictureBox3.Image = null;
        MessageBox.Show("does not exist");
    }
    conn.Close();
}
catch (Exception ex)
{
    conn.Close();
    MessageBox.Show(ex.Message);
}

4 个答案:

答案 0 :(得分:5)

string sql = "SELECT studnum,course,f_name,l_name,color_image FROM table3 WHERE f_name=@Name";
command = new SqlCommand(sql, conn);
command.Parameters.Add(new SqlParameter("@Name", textBoxfname.Text));

答案 1 :(得分:1)

我看到多个错误:

  1. 最明显的,总是在sql语句中使用参数。
  2. 始终使用块来清理连接。
  3. 不要重复使用连接,这是不好的做法,因为sql server会自动(默认情况下除非你把它关掉)使用连接池。

    //不要重复使用连接,在需要时创建一个新连接! 使用(var conn = new SqlConnection(/ 使用来自web / app .config /的连接)) {     const string sql =“SELECT studnum,course,f_name,l_name,color_image FROM table3 WHERE f_name = @name”;

    command = new SqlCommand(sql, conn);
    command.Parameters.Add(new SqlParameter("@name", SqlDbType.VarChar) { Value = textBoxfname.Text});
    
    conn.Open();
    
    /* rest of code unchanged but do not call conn.Close(), the using block will do this for you
    

    }

答案 2 :(得分:-1)

因此,要回答您的问题,您的SQL查询语法不正确。我会在sql字符串上断点,看看到底是什么错。当你这样做时应该很明显。

但真正的问题是您将应用程序暴露给SQL注入。让我们看一下你所拥有的基本例子。

"SELECT * FROM table WHERE id ='" + userinput.Text + "'";

因此,用户输入一些值,然后将其转储到查询中。简单吧?

如果用户输入此内容会发生什么

' OR 1=1; --

让我们看看你的sql字符串在添加后会变成什么

SELECT * FROM table WHERE id = '' OR 1=1; -- '

所以现在,你的查询字符串说选择id OR,其中1 = 1,这意味着true,这意味着一切。

SQL注入是一个真正的威胁,阻止它的唯一方法是从一开始就实施对策。

请查看参数化。在C#中它很容易。

MSDN Article on C# Parameterization

答案 3 :(得分:-3)

您必须在SQL中使用单引号作为字符串参数/字段:

string sql = "SELECT studnum,course,f_name,l_name,color_image FROM table3 WHERE f_name='" + textBoxfname.Text + "'";

但使用参数更好(更安全):

string sql = "SELECT studnum,course,f_name,l_name,color_image FROM table3 WHERE f_name=@name";
if (conn.State != ConnectionState.Open)
    conn.Open();
var command = new SqlCommand(sql, conn);
command.Parameters.Add("@name", SqlDbType.NVarChar).Value = textBoxfname.Text;