QA@IT

C# + SQLServerでクエリのパラメータを定数にする

10706 PV

お世話いなっております。

C#でSQLServerにレコードを追加したい場合

command.CommandText ="INSERT INTO Person(id, name) values(@id, @name)"
command.Parameters.Add(new SqlParameter("@id", "0000"));
command.Parameters.Add(new SqlParameter("@name", "山田太郎"));

こんな感じになると勉強したのですが、
カラムの名前が変更されるかもしれないのでハードコードはまずいです。
SQLクエリのカラム名の部分をハードコードではなく、定数にしたいのですが良い方法はありますか?

Java(Android)のContentValuesのような使い方をしたいです。

  • ヒント!
    ダブルクォテーションでくくられているということは文字列ですね。
    『文字列の連結』
    -
  • > カラムの名前が変更されるかもしれないのでハードコードはまずいです。  
    カラム名とは質問者さんのコードで言う id, name のことですよね。それが変更されて C# 側のコードを変更しなくて済むというのは具体的にどういうケースを考えてますか? 自分的には有り得ないように思うのですが。
    -

回答

定数にしたいのであれば次のような実装は可能です。
Visual Studioのバージョンによってはサンプルの記述は
出来ないのでString.Formatに置き換えて考えて下さい。

namespace WindowsFormsApplication3
{
    public partial class Form1 : Form
    {
        private const string COL1 = "ID";
        private const string COL2 = "NAME";

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            var dbname = new DBName2();
            SqlCommand cmd = new SqlCommand();
            cmd.CommandText = $"INSERT INTO Person ({COL1}, {COL2}) values (@Col1, @Col2)";
            cmd.CommandText = $"INSERT INTO Person ({DBName.COL1}, {DBName.COL2}) values (@Col1, @Col2)";
            cmd.CommandText = $"INSERT INTO Person ({dbname.COL1}, {dbname.COL2}) values (@Col1, @Col2)";
            cmd.Parameters.Add(new SqlParameter("@Col1", "0000"));
            cmd.Parameters.Add(new SqlParameter("@Col2", "山田太郎"));
        }
    }

    public static class DBName
    {
        public const string COL1 = "ID";
        public const string COL2 = "NAME";
    }

    public class DBName2
    {
        public string COL1 { get; set; } = "ID";
        public string COL2 { get; set; } = "NAME";
    }

}
編集 履歴 (0)
  • まさに求めていたものです。ありがとうございます。 -
ウォッチ

この質問への回答やコメントをメールでお知らせします。