SQL从Query中检测无效的列名称

时间:2016-08-29 17:21:38

标签: c# sql-server winforms ado.net sqlcommand

我尝试过运行代码,但我不知道查询有什么问题。因为它一直在说无效的列名,所以当我尝试从该列中检索数据时。列名称与DB中的列名称匹配。它连接良好,因为它连接到登录表单,在那里它检测到另一个给定的密码和名称。我是基于搜索文本框使用的。

private void btnSearch_Click(object sender, EventArgs e)
{   
    SqlConnection cnn = new SqlConnection(ConfigurationManager.ConnectionStrings["MyDetailConnectionString"].ToString());

    try
    {
        cnn.Open();
        SqlCommand command = new SqlCommand();
        command.Connection = cnn;
        string query = "SELECT *FROM AffiliatedRegister WHERE Username=" + txtUser.Text + "";
        command.CommandText = query;
        SqlDataReader reader = command.ExecuteReader();
        while (reader.Read())
        {
          ---[Converting String from db /Insert to textboxes]---
        }
        cnn.Close();
    }
    catch (Exception ex)
    {
        MessageBox.Show("Error" + ex);
    }
}

4 个答案:

答案 0 :(得分:4)

您需要将用户名文本换成引号。

您发出的sql脚本将如下所示:

Username

因此,SQL正在尝试将列InputUsername与列SELECT *FROM AffiliatedRegister WHERE Username='InputUserName' 进行比较。

用引号括起用户名后,它将是:

.asd

答案 1 :(得分:1)

首先,您的查询非常危险,请不要将其用于生产目的。

现在您需要做什么: - 在您的查询中,您需要在txtUser.Text周围使用单引号 像这样: -

  

“SELECT * FROM AffiliatedRegister WHERE Username = '”+ txtUser.Text   +“'”;

结果查询:SELECT * FROM AffiliatedRegister WHERE Username ='txtUser.Text';

你也可以加双引号,如: -

  

... Username = \“”+ txtUser.Text +“\”“;

它很复杂;-)之前的一个更适合阅读目的。


为什么没有运行?
因为除了整数之外的所有值都必须在查询中的单引号或双引号内传递。喜欢: -

  

SELECT * FROM TABLE_NAME WHERE TABLE_NAME.COLUMN_NAME =“VALUE”;

现在一件非常重要的事情请不要将这些类型的查询用于生产目的。我猜你正处于发展阶段,所以回答这个问题不会毁了你的生活...... !!!

答案 2 :(得分:1)

您的语句错误,因为您没有将字符串包装在引号中,因此Sql将其作为对象而不是字符串进行交错。那就是说你应该使用参数而不是字符串连接。

  1. 使用参数
  2. 将SqlConnection包装在使用块中
  3. 您应该在SELECT语句中指定列顺序,不要使用*。
  4. 除非您知道如何从中恢复,否则不要吞下异常
  5. 更新代码

    private void btnSearch_Click(object sender, EventArgs e)
    {
        // use ConnectionString property
        // wrap in using block
        using (SqlConnection cnn = new SqlConnection(ConfigurationManager.ConnectionStrings["MyDetailConnectionString"].ConnectionString))
        {
            try
            {
                SqlCommand command = new SqlCommand();
                command.Connection = cnn;
                // use parameters
                // avoid *, specify columns instead
                string query = "SELECT * FROM AffiliatedRegister WHERE Username= @userName";
                command.CommandText = query;
                // use parameters, I assumed the parameter type and length - it should be updated to the type and length specified in your table schema
                command.Parameters.Add(new SqlParameter("@userName", SqlDbType.VarChar, 200) {Value = txtUser.Text });
    
                // open as late as possible
                cnn.Open();
                SqlDataReader reader = command.ExecuteReader();
                while (reader.Read())
                {
                    // ---[Converting String from db / Insert to textboxes]-- -
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Error" + ex); 
    
                // do not swallow the exception unless you know how to recover from it
                throw;
            }
        }
    }
    

答案 3 :(得分:0)

您可以尝试替换字符串:string query = "SELECT *FROM AffiliatedRegister WHERE Username=" + txtUser.Text + "";

至:string query = "SELECT <yourcolumn> FROM AffiliatedRegister WHERE Username=" + txtUser.Text + "";

我认为有必要指定列名。

祝你好运