8

DataTable をストアド プロシージャのパラメーターとして使用するこの方法を再利用してきましたが、うまく機能しています。これは単純化された作業コードです。

using (dbEntities dbe = new dbEntities())
{
    var dt = new dataTable();
    dt.Columns.Add("ID");
    dt.Columns.Add("Message");
    dt.Columns.Add("CreatedOn", typeof(DateTime));

    foreach (var row in randomDataSource)
    {
        dt.Rows.Add(
            row.id,
            row.message,
            DateTime.Now
            );
    }

    var tableType = new SqlParameter("tableType", SqlDbType.Structured);
    tableType.Value = dt;
    tableType.TypeName = "[dbo].[RandomTableType]";

    dbe.ExecuteStoreCommand(
        "EXEC [dbo].[SaveTable] @tableType",
        new object[] { tableType }
        );
}

追加したいフィールドがバイナリ型の場合に問題が発生します。すなわち:

dt.Columns.Add("BinaryMessage", typeof(byte[]));

ちなみに、データベースの対応する列はvarbinary(MAX)です。これを実行しようとすると、次のエラーが発生します。

データ型 nvarchar(max) から varbinary(max) への暗黙的な変換は許可されていません。CONVERT 関数を使用して、このクエリを実行します。

これを機能させるために必要なものを変更するにはどうすればよいですか?

4

1 に答える 1

13

.NET でのバイナリ文字列の表現はSqlBinary構造体です。

次のように列を追加します。

dt.Columns.Add("BinaryMessage", typeof(SqlBinary));

このSqlBinaryクラスには、バイト配列への明示的な変換とバイト配列からの暗黙的な変換があります。そのため、バイト配列から列への値は単純な代入ですが、列からバイト配列を取得するには明示的なキャストが必要です。

于 2012-09-19T13:40:50.427 に答える