C# の t-sql 選択クエリで問題が発生しています。クエリは次のとおりです。
@"SELECT * FROM
(SELECT *, ROW_NUMBER() OVER (ORDER BY id) as row_number
FROM [mytable]) t0
WHERE row_number BETWEEN @skip and @take
AND
uploadDate IN (@years)
AND NOT photoId IN (@shownPhotos)
ORDER BY NEWID()";
cmd.Parameters.Add("@skip", SqlDbType.Int).Value = skip;
cmd.Parameters.Add("@take", SqlDbType.Int).Value = take;
cmd.Parameters.Add("@shownPhotos", SqlDbType.VarChar).Value = shownPhotos;
cmd.Parameters.Add("@years", SqlDbType.VarChar).Value = years;
このメソッドは、skip count、take count、shownPhotos (写真 ID を含むカンマ区切りの文字列)、years (写真を表示する年を含むカンマ区切りの文字列) の 4 つのパラメータを取ります。
したがって、基本的には、コンマ区切りの文字列のいずれかの年に一致し、まだ表示されていないデータベースから写真を返す必要があります。
問題 (私が思うに) は、パラメーターが文字列であるため、'1234,567,890' および '2011,2012' として解釈されることです。を使用せずに SQL サーバー管理ツールでクエリを実行すると、正常に動作します。
誰かがこれに対する回避策を持っていますか? :-)
よろしくお願いします!
更新されたコード:
// Create datatables
DataTable yearsTable = new DataTable();
yearsTable.Columns.Add("YearID", typeof(string));
yearsTable.Columns.Add("Year", typeof(string));
foreach(string year in years.Split(','))
yearsTable.Rows.Add(new object[] { year, year });
using (var conn = new SqlConnection(GlobalSettings.DbDSN))
{
conn.Open();
using (var cmd = conn.CreateCommand())
{
cmd.CommandType = CommandType.Text;
cmd.CommandText =
@"SELECT * FROM
(SELECT *, ROW_NUMBER() OVER (ORDER BY id) as row_number
FROM [mytable]) t0
WHERE row_number BETWEEN @skip and @take
AND
uploadedDate IN (@years)
ORDER BY NEWID()";
SqlParameter skipParam = cmd.Parameters.AddWithValue("@skip", skip);
skipParam.SqlDbType = SqlDbType.Int;
SqlParameter takeParam = cmd.Parameters.AddWithValue("@take", take);
takeParam.SqlDbType = SqlDbType.Int;
SqlParameter yearsParam = cmd.Parameters.AddWithValue("@years", yearsTable);
yearsParam.SqlDbType = SqlDbType.Structured;
yearsParam.TypeName = "dbo.MyTableType";
var reader = cmd.ExecuteReader();
}