2016年9月27日

パラメータークエリを使用してSQL Serverからデータを読み込む



パラメーターを使ってSQL Serverからデータを読み込む方法です。

ちなみに今回、SQL Serverにあらかじめ以下のようなテーブルを作成しています。

テーブル名:T_Animals

列名
[ID] [int] NOT NULL
[Name] [nvarchar](50) NULL
[Type] [nvarchar](50) NULL

格納されてるデータ
ID Name Type
1 たま
2 ピーター うさぎ
3 トム
4 お父さん
5 ふてニャン
6 プー くま
7 ファーファ くま
8 ラスカル アライグマ
9 サトちゃん
10 チーバくん
11 パトラッシュ



■C#
string ConnectionString = string.Empty;
ConnectionString = @"Data Source=localhost\MSSQLSERVER;Initial Catalog=TESTDB;Integrated Security=True";

var cnn = new SqlConnection(ConnectionString);

cnn.Open();

var cmd = new SqlCommand();
SqlDataReader dtr = null;

cmd.Connection = cnn;
cmd.CommandType = System.Data.CommandType.Text;

// データソースで実行するTransact-SQLステートメントを指定
cmd.CommandText = "SELECT [ID], [Name], [Type] FROM [T_Animals] WHERE [Type] = @Type";
cmd.Parameters.Clear();
// パラメータ値を設定
cmd.Parameters.Add("@Type", System.Data.SqlDbType.NVarChar, 50).Value = "猫";

dtr = cmd.ExecuteReader();

if (dtr.HasRows)
{
    while(dtr.Read())
    {
        Console.WriteLine("{0},{1},{2}", dtr["ID"].ToString(), dtr["Name"], dtr["Type"]);
    }
}

dtr.Close();
cmd.Dispose();
cnn.Close();


■VB
Dim ConnectionString As String = String.Empty
ConnectionString = "Data Source=localhost\MSSQLSERVER;Initial Catalog=TESTDB;Integrated Security=True"

Dim cnn = New SqlConnection(ConnectionString)

cnn.Open()

Dim cmd = New SqlCommand()
Dim dtr As SqlDataReader = Nothing

cmd.Connection = cnn
cmd.CommandType = System.Data.CommandType.Text

'データソースで実行するTransact-SQLステートメントを指定
cmd.CommandText = "SELECT [ID], [Name], [Type] FROM [T_Animals] WHERE [Type] = @Type"
cmd.Parameters.Clear()
'パラメータ値を設定
cmd.Parameters.Add("@Type", System.Data.SqlDbType.NVarChar, 50).Value = "猫"

dtr = cmd.ExecuteReader()

If dtr.HasRows Then
    While dtr.Read()
        Console.WriteLine("{0},{1},{2}", dtr("ID").ToString(), dtr("Name"), dtr("Type"))
    End While
End If

dtr.Close()
cmd.Dispose()
cnn.Close()

このParametersを使ってクエリに値を渡すことによって型チェックと検証の機能を実現しています。また、パラメーターの入力は実行可能なコードとしてではなくリテラル値として扱われますので、SQLインジェクションを防ぐことができます。

パラメーターの型は、実際のテーブルのフィールドの型に合わせます。
上の例では、[Type]がnvarchar(50)ですので、
cmd.Parameters.Add("@Type", System.Data.SqlDbType.NVarChar, 50).Value = "猫";
としています。

SqlDbTypeについては、SqlDbType 列挙体 (System.Data)をご覧ください。


結果はこのようになります。
1,たま,猫
3,トム,猫
5,ふてニャン,猫



スポンサーリンク