繁体   English   中英

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

[英]SQL Invalid Column name detection from Query

我试过运行代码,我不知道查询有什么问题。 因为它一直在说无效的列名,所以当我尝试从该列中检索数据时。 列名称与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);
    }
}

您需要将用户名文本包装在引号中。

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

SELECT *FROM AffiliatedRegister WHERE Username=InputUserName

所以SQL试图将列Username与列InputUsername进行比较。

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

SELECT *FROM AffiliatedRegister WHERE Username='InputUserName'

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

现在你需要做什么: -
在您的查询中,您需要在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”;

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

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

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

更新代码

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;
        }
    }
}

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

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

我认为有必要指定列名。

最好的祝福

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM