0

SQL データベースの 1 つを検索するための単純な C# フォームをセットアップしようとしています。デバッグしようとすると、「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 インジェクション攻撃の脆弱性が含まれていることに注意してください。パラメーターを使用して BadgeCode を指定する必要があります。

于 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 インジェクション攻撃への確実な経路です。
パラメータを使用するようにコードを変更します

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 に答える