将字符串从数据库从一个表单发送到另一个表单
Posted
技术标签:
【中文标题】将字符串从数据库从一个表单发送到另一个表单【英文标题】:Sending String from Database from one Form to another 【发布时间】:2016-03-02 14:36:55 【问题描述】:我正在尝试将字符串和布尔值从一种形式发送到另一种形式。我要发送的字符串是 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();
我得到了错误:
抛出异常:“System.Data.OleDb.OleDbException”在 System.Data.dll
附加信息:查询中的语法错误(缺少运算符) 表达式 '(FirstName + ' ' + LastName) =Gary Lindsay'。
DropBoxEMP 是一个组合框,其中包含从 [Employee] 附加的名字和姓氏。 Gary Lindsay 是表 [Employee] 中附加的名字和姓氏 我应该如何更改我的代码以正确发送字符串? 任何帮助将不胜感激
【问题讨论】:
当您使用参数提供值时,您 1) 将解决问题; 2)防止sql注入攻击 如何编辑我的代码来做到这一点? 本题有一个使用参数化查询的例子:***.com/questions/12048152/oledb-parameterized-query 【参考方案1】:我强烈怀疑发生这种情况是因为您忘记在
中使用单引号(FirstName + ' ' + LastName) =" +DropBoxEmp.Text
应该是
(FirstName + ' ' + LastName) = '" + DropBoxEmp.Text + "'"
但不要使用这种方式。
您应该始终使用parameterized queries。这种字符串连接对SQL Injection 攻击开放。还可以使用using
statement 来处理您的命令,就像您为连接所做的那样。该语句提供了一种自动处理方法,因此您不需要手动关闭连接。
同样将ExecuteNonQuery
用于SELECT
语句没有意义。这个方法只是执行你的查询。它确实不返回任何数据或其他东西。
如果您想从查询中返回一些数据,您可以使用 ExecuteReader
或 ExecuteScalar
如果您的查询只返回一行,我认为这是您的情况。
string NewPayroll = (string)GetPayRoll.ExecuteScalar();
【讨论】:
声纳,你总是帮我,谢谢!我会尽快将此标记为答案! 我已经删除了我的评论,因为它根本没有意义;-)【参考方案2】:当您使用参数提供值时,您 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 注意到 cmets 之后执行查询。
【讨论】:
是的,这正是我几乎所做的,感谢您的帮助!以上是关于将字符串从数据库从一个表单发送到另一个表单的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Hibernate、Spring MVC 将数据从单个表单发送到多个数据库表
将 HTML 数据从表单发送到 JSON 文件 (Ajax/Jquery)