5

ユーザー定義のテーブル型を受け入れるストアド プロシージャがあり、ユーザー定義のデータ型のすべての列の既定値が null に設定されています。現在、残りの列の値がnullに設定されることを期待して、列が少ないdataTableをC#コードからストアドプロシージャに渡しています。

しかし、私はこのエラーが発生しています:対応するユーザー定義のテーブル型が 77 列を必要とする 21 列のテーブル値パラメーターを渡そうとしています。これがコードです

  SqlConnection conn = new SqlConnection("server=****; database=***;integrated security=SSPI");
  DataSet dataset=new DataSet();
  conn.Open();
  SqlCommand cmd = new SqlCommand("Insert");      
  cmd.CommandType = CommandType.StoredProcedure;
  cmd.Connection = conn;
  SqlParameter para = new SqlParameter();
  para.ParameterName = "@TableVar";
  para.SqlDbType = SqlDbType.Structured;
  //SqlParameter para=cmd.Parameters.AddWithValue("@TableVar",table);
  para.Value = table;
  cmd.Parameters.Add(para);
  cmd.ExecuteNonQuery();
4

2 に答える 2

2

SqlDataAdapter を使用して、テーブル型スキーマに一致する DataTable を作成できます。

DataTable table = new DataTable();

// Declare a variable of the desired table type to produce a result set with it's schema.
SqlDataAdapter adapter = new SqlDataAdapter("DECLARE @tableType dbo.UserDefindTableType 
                                             SELECT * FROM @tableType", ConnectionString);

// Sets the DataTable schema to match dbo.UserDefindTableType .
adapter.FillSchema(table, SchemaType.Source);

次に、すべての既定の列値を使用して DataRows を作成し、知っている列を設定するだけです。

DataRow row = table.NewRow();

// Set know columns...
row["ColumnName"] = new object();

// or check column exists, is expected type etc first
if (table.Columns.Contains("ColumnName") 
    && table.Columns["ColumnName"].DataType == typeof(string)) {
    row["ColumnName"] = "String";
}

table.Rows.Add(row);
于 2015-06-11T01:41:55.023 に答える
1

私は同じ問題を抱えており、私が取り組んでいる解決策は、追加の SQL クエリを実行して列定義を取得し、不足している列で DataTable を埋めることです。これは、テーブルの列定義の SQL ステートメントです。タイプ:

select c.name, t.name as type, c.max_length as length from sys.table_types tt
inner join sys.columns c on c.object_id = tt.type_table_object_id
inner join sys.types t on t.system_type_id = c.system_type_id
where tt.name = @tabletypename
order by c.column_id

SqlDbTypeすべてのテーブル値パラメーター定義に対してソリューションを機能させたい場合は、戻り値の型 (つまり、VARCHAR、INT など) を列挙型に解析する必要があるため、C# コードはもう少し面倒になります。

このようなことは、ローカル ファイル システムへの書き込みアクセス権がない場合に CSV ファイルをインポートする次善の方法として、Microsoft が SQL Server エンジン内でより適切に解決できると考えていましたが、単一の UDTT で対応できるようにしたいと考えています。新しいファイル形式を扱うたびに、すべての CSV ファイルで新しいテーブル タイプを作成する必要がありません。とにかく..暴言。

于 2015-06-11T00:37:20.800 に答える