C# 将多个字符串参数传递给SQL Server过程

C# 将多个字符串参数传递给SQL Server过程,c#,sql-server,C#,Sql Server,我有一个在select条件中使用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 !=

我有一个在select条件中使用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);
不知何故,我没有得到这些价值观。我确信问题在于QueryManager字符串。它的建造方式缺少了一些东西。有人能告诉我怎样才能做到吗

以下是调用数据库的代码:

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;
}

不太清楚如何传递参数,但似乎传递了一个带分隔符的字符串。这是行不通的。您的过程需要国家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


看起来,在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)));

请显示Global.DatabaseServices的代码。GetCountyReport@zaitsman,更新了。现在我们需要的代码ExecutyQuery@zaitsman.. 更新。ExecutyQuery是一种通用方法,您可以尝试更改da=new SqlDataAdapter;da.SelectCommand=cmd;to da=新的SqlDataAdaptercmd;?
     queryManageString = string.Join(",", words.Select(x => string.Format("'{0}'", x)));