0

我正在尝试设置一个简单的 c# 表单来搜索我们的一个 SQL 数据库。当我尝试调试时,我不断收到“SQLException was Unhandled”错误。我知道 SQL 语句有效,我可以在我的服务器上正常运行它。我认为这是我尝试从文本框中输入数据的方式的问题。有人可以给我一些指导吗?

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;

namespace USER_Lookup
{
    public partial class Search : Form
    {
        DataSet ds = new DataSet();
        SqlConnection cs = new SqlConnection("Data Source=PC01; Initial Catalog=DB01; Integrated Security=TRUE");
        SqlDataAdapter da = new SqlDataAdapter();

        public Search()
        {
            InitializeComponent();
                    }

        private void button_Search_Click(object sender, EventArgs e)
        {
            string badgeCode = textBox_badgeCode.Text.Trim();
            da.SelectCommand = new SqlCommand
                ("SELECT db01.dbo.staff.lastname AS 'Last Name', db01.dbo.staff.firstname AS 'First Name', db01.dbo.staff.badgecode AS 'User ID', db01.dbo.staffrole.name AS 'Role' FROM db01.dbo.staff, db01.dbo.staffrole, db01.dbo.staff_staffrole WHERE db01.dbo.staff.badgecode =" + badgeCode + "AND db01.dbo.staff.id = db01.dbo.staff_staffrole.staff_id AND db01.dbo.staff_staffrole.staffrole_id = db01.dbo.staffrole.id", cs);
            ds.Clear();
            da.Fill(ds);

            dg.DataSource = ds.Tables[0];
        }
    }
}
4

2 回答 2

2

我相信您需要在 badgeCode 周围加上单引号。此外,您在下一个AND之前缺少一个空格。试试这个:

...staff.badgecode = '" + badgeCode + "' AND...

请记住,您的代码包含 SQL 注入攻击漏洞。您应该使用参数来提供徽章代码。

于 2012-10-25T21:24:41.490 回答
1

这里没有空间

... db01.dbo.staff.badgecode =" + badgeCode + "AND db01.dbo.staff.id ....
                                              ^^^^

您也在这里使用maclive.dbo.staff.lastname,但该数据库没有 FROM 或 JOIN
(错字?)

而且,如果db01.dbo.staff.badgecode是一个 varchar 字段,那么您需要在您的 badgeCode 变量周围加上单引号。但是,字符串连接形成 SQL 命令是Sql Injection 攻击的必经之路。
更改代码以使用参数

da.SelectCommand = new SqlCommand 
    ("SELECT maclive.dbo.staff.lastname AS 'Last Name', " + 
     "db01.dbo.staff.firstname AS 'First Name', db01.dbo.staff.badgecode AS 'User ID',  "+ 
     "db01.dbo.staffrole.name AS 'Role' " + 
     "FROM db01.dbo.staff, db01.dbo.staffrole, db01.dbo.staff_staffrole " + 
     "WHERE db01.dbo.staff.badgecode =@badge AND db01.dbo.staff.id = " + 
     "db01.dbo.staff_staffrole.staff_id AND db01.dbo.staff_staffrole.staffrole_id = " + 
     "db01.dbo.staffrole.id", cs);

da.SelectCommand.Parameters.AddWithValue("@badge", badgecode);
于 2012-10-25T21:25:03.080 回答