我有一个存储过程在选择条件中使用IN
语句。
SELECT *
FROM vwCashTransactions
WHERE TransactionTimeStamp BETWEEN '2017-01-30 ' AND '2017-12-01'
AND Country IN ('MY', 'BD')
ORDER BY TransactionTimeStamp DESC
我需要从后端代码传递国家/地区字符串。
这是我写的代码
if (manageCountries != null && manageCountries.Trim().Length > 0)
{
string[] words = manageCountries.Split(',');
string queryManageString = "";
int i = 0;
foreach (string word in words)
{
if (i != 0)
{
queryManageString += "','";
}
i++;
queryManageString += "'" + word + "'";
}
_DataTable = Global.DatabaseServices.GetTransactionReport("", startPeriod, endPeriod, queryManageString);
不知怎的,我没有得到这些价值观。我确信问题出在querymanageString
上。它的构建方式缺少一些东西。有人能说出我是如何实现它的吗?
以下是调用数据库的代码:
public DataTable GetTransactionReport(string AccountCode, DateTime FromDate, DateTime ToDate, string ManagedCountry)
{
DataTable dataTable = new DataTable();
SqlCommand sqlCommand = new SqlCommand();
sqlCommand.CommandText = "[GetTransactionReport]";
sqlCommand.CommandType = CommandType.StoredProcedure;
sqlCommand.Parameters.AddWithValue("@AccountCode", AccountCode);
sqlCommand.Parameters.AddWithValue("@FromDate", FromDate);
sqlCommand.Parameters.AddWithValue("@ToDate", ToDate);
sqlCommand.Parameters.AddWithValue("@ManagedCountry", ManagedCountry);
sqlCommand.CommandTimeout = 300;
ExecuteQuery(dataTable, sqlCommand);
sqlCommand.Dispose();
return dataTable;
}
public int ExecuteQuery(DataTable dt, SqlCommand cmd)
{
int rowCount = 0;
SqlDataAdapter da = null;
try
{
if (cmd.Connection == null)
cmd.Connection = GetSqlConnection();
da = new SqlDataAdapter();
da.SelectCommand = cmd;
rowCount = da.Fill(dt);
}
catch (Exception ex)
{
throw new DatabaseException(ex);
}
finally
{
cmd.Connection.Close();
cmd.Connection.Dispose();
cmd.Connection = null;
da.Dispose();
}
return rowCount;
}
答案 0 :(得分:1)
如何传递参数并不是很清楚,但似乎你传递了一个分隔的字符串。这不行。您的过程需要国家/地区ID列表,而不是带分隔符的字符串。
你可以在存储过程中做一些魔术,分割字符串和类似的东西,或者创建你自己的类型。
尝试这样的事情:
CREATE TYPE [dbo].[StringList] AS TABLE
([StringValue] [varchar](200) NULL)
然后您的存储过程有一个StringList
类型的参数,可以像普通表一样使用:
ALTER PROCEDURE [dbo].[MySproc]
@ids AS dbo.StringList READONLY
AS
BEGIN
SET NOCOUNT ON;
...etc..
最后,在您的代码中使用DataTable作为值:
DataTable idsDT = new DataTable();
idsDT.Columns.Add("StringValue", typeof(string));
// fill datatable here
命令参数应为SqlDbType.Structured
var cmd = new SqlCommand(....)
SqlParameter countryParam = cmd.Parameter.AddWithValue("ids", idsDT);
countryParam.SqlDbType = SqlDbType.Structured;
答案 1 :(得分:0)
看来,你的for循环中有一些错误,你创建了逗号分隔的单引号字符串。使用以下内容更新循环:
string[] words = manageCountries.Split(',');
string queryManageString = "";
int i = 0;
foreach (string word in words)
{
if (i != 0)
{
queryManageString += ",'" + word + "'";
}
else
{
queryManageString += "'" + word + "'";
}
i++;
}
或者,如果您不想使用for循环,这里是一行解决方案
queryManageString = string.Join(",", words.Select(x => string.Format("'{0}'", x)));