将数据库中的字符串从一种形式发送到另一种形式
Sending String from Database from one Form to another
我正在尝试将一个字符串和一个布尔值从一种形式发送到另一种形式。我要发送的字符串是 PayrollNo,其中名称也存在于 ODeDb 数据库中。
这是我正在使用的代码,但它不起作用,
private void BtnContinue_Click(object sender, EventArgs e)
{
string ConnString = @"Provider = Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\HoliPlanData.accdb;Persist Security Info=False";
string Query = "SELECT PayrollNo, FirstName, LastName FROM [Employee] WHERE (FirstName + ' ' + LastName) =" +DropBoxEmp.Text;
EmployeeDetails form = new EmployeeDetails();
using (OleDbConnection Conn = new OleDbConnection(ConnString))
{
Conn.Open();
OleDbCommand GetPayRoll = new OleDbCommand(Query, Conn);
string NewPayroll = (GetPayRoll.ExecuteNonQuery()).ToString();
Conn.Close();
form.PassValuePayrollNo = NewPayroll;
form.PassEditing = true;
form.Tag = this;
form.Show(this);
Hide();
}
}
我收到错误:
Exception thrown: 'System.Data.OleDb.OleDbException' in
System.Data.dll
Additional information: Syntax error (missing operator) in query
expression '(FirstName + ' ' + LastName) =Gary Lindsay'.
DropBoxEMP 是一个组合框,其中填充了 [Employee] 附加的名字和姓氏。
Gary Lindsay 是 Table [Employee] 附加的名字和姓氏
我应该如何更改我的代码以正确发送字符串?
任何帮助将不胜感激
我强烈怀疑发生这种情况是因为您忘记为您的
使用单引号
(FirstName + ' ' + LastName) =" +DropBoxEmp.Text
应该是
(FirstName + ' ' + LastName) = '" + DropBoxEmp.Text + "'"
但是不要用这种方式。
您应该始终使用 parameterized queries. This kind of string concatenations are open for SQL Injection attacks. Also use using
statement 来处理您的命令,就像处理您的连接一样。此语句提供了一种自动处理方法,因此您不需要手动关闭连接。
对 SELECT
语句使用 ExecuteNonQuery
也没有意义。此方法只是 执行您的查询。它不return任何数据或其他东西。
如果您想 return 从您的查询中获取一些数据,您可以使用 ExecuteReader
或 ExecuteScalar
如果您的查询 return 只有一行,我认为是在你的情况下。
string NewPayroll = (string)GetPayRoll.ExecuteScalar();
当您使用参数提供值时,您 1) 将解决(第一个)问题; 2) 防止 sql 注入攻击(计算出当您添加缺少的引号但想获取有关 "Paddy O'Malley" 的详细信息时您的串联查询会做什么)。
本人OleDb用得不多,所以可能有错误,但会提供方向:
首先:更改查询以使用参数:
string Query = "SELECT PayrollNo, FirstName, LastName FROM [Employee]"+
" WHERE (FirstName + ' ' + LastName) = ?";
然后将该参数加值添加到命令对象:
GetPayRoll.Parameters.Add("?", OleDbType.VarChar, 50).Value = DropBoxEmp.Text;
然后在注意到 Soner Gönül 的评论后执行查询。
我正在尝试将一个字符串和一个布尔值从一种形式发送到另一种形式。我要发送的字符串是 PayrollNo,其中名称也存在于 ODeDb 数据库中。
这是我正在使用的代码,但它不起作用,
private void BtnContinue_Click(object sender, EventArgs e)
{
string ConnString = @"Provider = Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\HoliPlanData.accdb;Persist Security Info=False";
string Query = "SELECT PayrollNo, FirstName, LastName FROM [Employee] WHERE (FirstName + ' ' + LastName) =" +DropBoxEmp.Text;
EmployeeDetails form = new EmployeeDetails();
using (OleDbConnection Conn = new OleDbConnection(ConnString))
{
Conn.Open();
OleDbCommand GetPayRoll = new OleDbCommand(Query, Conn);
string NewPayroll = (GetPayRoll.ExecuteNonQuery()).ToString();
Conn.Close();
form.PassValuePayrollNo = NewPayroll;
form.PassEditing = true;
form.Tag = this;
form.Show(this);
Hide();
}
}
我收到错误:
Exception thrown: 'System.Data.OleDb.OleDbException' in System.Data.dll
Additional information: Syntax error (missing operator) in query expression '(FirstName + ' ' + LastName) =Gary Lindsay'.
DropBoxEMP 是一个组合框,其中填充了 [Employee] 附加的名字和姓氏。 Gary Lindsay 是 Table [Employee] 附加的名字和姓氏 我应该如何更改我的代码以正确发送字符串? 任何帮助将不胜感激
我强烈怀疑发生这种情况是因为您忘记为您的
使用单引号(FirstName + ' ' + LastName) =" +DropBoxEmp.Text
应该是
(FirstName + ' ' + LastName) = '" + DropBoxEmp.Text + "'"
但是不要用这种方式。
您应该始终使用 parameterized queries. This kind of string concatenations are open for SQL Injection attacks. Also use using
statement 来处理您的命令,就像处理您的连接一样。此语句提供了一种自动处理方法,因此您不需要手动关闭连接。
对 SELECT
语句使用 ExecuteNonQuery
也没有意义。此方法只是 执行您的查询。它不return任何数据或其他东西。
如果您想 return 从您的查询中获取一些数据,您可以使用 ExecuteReader
或 ExecuteScalar
如果您的查询 return 只有一行,我认为是在你的情况下。
string NewPayroll = (string)GetPayRoll.ExecuteScalar();
当您使用参数提供值时,您 1) 将解决(第一个)问题; 2) 防止 sql 注入攻击(计算出当您添加缺少的引号但想获取有关 "Paddy O'Malley" 的详细信息时您的串联查询会做什么)。
本人OleDb用得不多,所以可能有错误,但会提供方向:
首先:更改查询以使用参数:
string Query = "SELECT PayrollNo, FirstName, LastName FROM [Employee]"+
" WHERE (FirstName + ' ' + LastName) = ?";
然后将该参数加值添加到命令对象:
GetPayRoll.Parameters.Add("?", OleDbType.VarChar, 50).Value = DropBoxEmp.Text;
然后在注意到 Soner Gönül 的评论后执行查询。