none
SqlCommand.Parameters の使用時のNプレフィックスについて RRS feed

  • 質問

  • いつもお世話になっております。

    SqlCommand.Parameters の使用時のNプレフィックスについて質問させていただきます。

    VisualStudio2008 C# でプログラムを作成しています。

    DBはSQLServer2008 R2です。

    SQLServerにテーブルを作成し、NVarcharの列を作成しました。

    そこに、値をインサートしたいのですが、現在以下のようにプログラムしています。

    string strParametar = "森鷗外";
    string commandText = "Insert Into testTable SET testColumn = @Param";
    using (SqlConnection connection = new SqlConnection(connectionString))
        {
      SqlCommand command = new SqlCommand(commandText, connection);
      command.SqlCommand.Parameters.Add("@Param", SqlDbType.NVarChar, 500);
      command.SqlCommand.Parameters["@Param"].Direction = ParameterDirection.Input;
      command.SqlCommand.Parameters["@Param"].Value = strParametar;
      try
      {
       connection.Open();
       command.ExecuteNonQuery();
      }
      catch (Exception ex)
      {
      }
     }

    しかし、これでは"鷗"が文字化けしてしまいます。

    Management Studio で、

    Insert Into testTable SET testColumn = N'森鷗外'

    と、Nプレフィックスをつけて実行すれば、問題なくインサートできます。

    commandText = "Insert Into testTable SET testColumn = N'" + strParametar + "'"

    としてしまえばよいのですが、出来ればSqlCommand.Parametersを使用し、名前付きパラメータを使用したいと考えております。

    ちなみに

    command.Parameters.AddWithValue("@Param", strParametar );

    も試しましたがだめでした。

    msdnから、見つけられていないのかもしれませんが、どなたかご教授いただきたく、

    よろしくお願いいたします。

    2012年6月4日 3:12

回答

  • command.SqlCommand.Parameters.Add("@Param", SqlDbType.NVarChar, 500);

    と NVarChar を指定しているのに

    N'@Param varchar(500)',
    @Param='森?外'

    と varchar になってしまうのですか? なんてこった。

    • 回答としてマーク masami.k 2012年6月5日 1:44
    2012年6月5日 0:11
  • 確認ですが、SQL Server Profilerで実際に発行されたSQLを見た際に、Nプレフィックスが付いていないのでしょうか?


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    • 回答の候補に設定 佐祐理 2012年6月5日 1:59
    • 回答としてマーク masami.k 2012年6月5日 3:00
    2012年6月4日 5:17
    モデレータ

すべての返信

  • 確認ですが、SQL Server Profilerで実際に発行されたSQLを見た際に、Nプレフィックスが付いていないのでしょうか?


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    • 回答の候補に設定 佐祐理 2012年6月5日 1:59
    • 回答としてマーク masami.k 2012年6月5日 3:00
    2012年6月4日 5:17
    モデレータ
  • trapemiya様

    返信ありがとうございます。

    プロファイラを使用できる環境でなかったため確認しておりませんでしたが、

    使用できるようにして確認しました。

    以下のようになっていました。

    exec sp_executesql N'INSERT INTO testTable(testColumn)
    VALUES( @Param ) ',
    N'@Param varchar(500)',
    @Param='森?外'

    @Paramに代入するところではNプレフィックスはついておりませんでしたが、

    ここで既に文字化けしていることがおかしいということに気づきました。

    ということは、ここの問題?

    command.SqlCommand.Parameters["@Param"].Value = strParametar;

    代入する文字列の文字コードをどうにかしないといけないということですね。

    まず、その辺を調べてみたいと思います。

    2012年6月4日 10:51
  • command.SqlCommand.Parameters.Add("@Param", SqlDbType.NVarChar, 500);

    と NVarChar を指定しているのに

    N'@Param varchar(500)',
    @Param='森?外'

    と varchar になってしまうのですか? なんてこった。

    • 回答としてマーク masami.k 2012年6月5日 1:44
    2012年6月5日 0:11
  • 佐祐理様

    返信ありがとうございました。

    ご指摘の点、プロファイラを見ているときにまったく気づいておりませんでした。

    こちらにコピーする際に、消してしまったのかと思い確認したところ、

    やはり、varchar(500)となっていました。

    どういうことかと、よくよくソースを読んでみたところ、

    原因がわかりました。

    じつは、投稿させていただいたソースは、一部省いているところがあるのですが、

    原因はそこにあり、SqlDbType.NVarCharだったら、SqlDbType.VarCharにするというコードがありました。

    そこの処理をやめたら、うまくいきました。

    ありがとうございました。

    trapemiya様もありがとうございました。

    プロファイラを見ないで確認はありませんね。

    横着してました。

    よい勉強になりました。

    2012年6月5日 1:43
  • 質問文に書かれていることが全てですので、質問文が間違っているとどうしようもないですね。
    念のため、

    command.Parameters.AddWithValue("@Param", strParametar );

    も本当にダメなのですか? "森鷗"になっちゃうとか?

    2012年6月5日 1:51
  • 佐祐理様

    確かに、完全な回答をいただくには、情報を全部出さなければなりませんね。

    元のコードは、かなり大きなものだったので、一部分だけにしていました。

    しかし、お二方のご指摘で、絞り込むことができました。

    AddWithValueについても確認したところ、まったく問題ありませんでした。

    ありがとうございました。

    2012年6月5日 1:57