SQL 从查询中检测到无效的列名
SQL Invalid Column name detection from Query
我试过 运行 代码,但我不知道查询有什么问题。因为它一直在说无效的列名,所以当我试图从该列中检索数据时。列名称与数据库中的名称相匹配。它连接良好,因为它连接到一个登录表单,它可以在其中检测到其他给定的密码和名称。我基于搜索文本框使用。
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);
}
}
您可以尝试替换您的字符串:string query = "SELECT *FROM AffiliatedRegister WHERE Username=" + txtUser.Text + "";
至:string query = "SELECT <yourcolumn> FROM AffiliatedRegister WHERE Username=" + txtUser.Text + "";
我认为有必要指定列名。
此致
您需要将用户名文本括在引号中。
您发出的 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 将其插入为对象而不是字符串。话虽如此,您应该使用参数而不是字符串连接。
- 使用参数
- 将您的Sql连接包装在 using 块中
- 你应该在SELECT语句中指定列顺序,不要使用*.
- 除非您知道如何从中恢复,否则不要吞下异常
更新代码
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;
}
}
}
我试过 运行 代码,但我不知道查询有什么问题。因为它一直在说无效的列名,所以当我试图从该列中检索数据时。列名称与数据库中的名称相匹配。它连接良好,因为它连接到一个登录表单,它可以在其中检测到其他给定的密码和名称。我基于搜索文本框使用。
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);
}
}
您可以尝试替换您的字符串:string query = "SELECT *FROM AffiliatedRegister WHERE Username=" + txtUser.Text + "";
至:string query = "SELECT <yourcolumn> FROM AffiliatedRegister WHERE Username=" + txtUser.Text + "";
我认为有必要指定列名。
此致
您需要将用户名文本括在引号中。
您发出的 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 将其插入为对象而不是字符串。话虽如此,您应该使用参数而不是字符串连接。
- 使用参数
- 将您的Sql连接包装在 using 块中
- 你应该在SELECT语句中指定列顺序,不要使用*.
- 除非您知道如何从中恢复,否则不要吞下异常
更新代码
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;
}
}
}