2017-02-25 30 views
0

私は文字列ビルダーを使用して次のコードを書いています。StringBuilderを使用してストアドプロシージャを書き込む方法は?

StringBuilder query = new StringBuilder("select distinct tc.bracode as [Branch Code] ,tc.braname as [Branch Name], tc.collname as [College Name],tu.uniname as University from tblcollegelist tc inner join tbluniversity tu on tc.uniid=tu.uniid where ("); 

for (int i = 0; i < uni.Count; i++) 
{ 
    query.Append("tu.uniname='" + uni[i] + "'"); 

    if (i < uni.Count - 1) 
    { 
     query.Append(" or "); 
    } 
} 

query.Append(") "); 
query.Append(" and "); 
query.Append(" ("); 

for (int i = 0; i < branch.Count; i++) 
{ 
    query.Append("tc.braname='" + branch[i] + "'"); 

    if (i < branch.Count - 1) 
    { 
     query.Append(" or "); 
    } 
} 

query.Append(") "); 
query.Append("group by tc.bracode ,tc.braname , tc.collname,tu.uniname"); 

string sqlquery = query.ToString(); 

cmd = new SqlCommand(sqlquery, con); 

dr = cmd.ExecuteReader(); 

dt.Load(dr); 

dataGridView1.DataSource = dt; 

C#のパラメータを使用して複数の値をストアドプロシージャに渡すことはできますか? ex:select * from table from country( 'India' 'USA' 'UK')

ここでは3つの値がありますが、どのようにしてこの3つの値をストアすることができますか?

+2

これはストアドプロシージャではありません。あなたの質問は不明です。 –

答えて

0

あなたの問題の解決策はそれほど簡単ではなく、共有したクエリを最適化する必要があります。 最初に、orを使用して複数の値を1つの列と比較する代わりに、IN句を使用する必要があります。 INのサンプルクエリは次のようになります。

SELECT column1, column2 FROM Table1 WHERE column2 IN ('val1','val2','val3') 

column2は、リスト内の提供のいずれかの値と一致したとき、これは結果を返します。

ストアドプロシージャを使用してこれを実現するには、Table-valued Parameterというフィーチャを使用する必要があります。

まず、データベースに次のような種類のテーブルを作成する必要があります。

CREATE TYPE dbo.ValueList 
AS TABLE 
(
    strValue NVARCHAR(50) 
); 

その後、ストアドプロシージャを使用すると、それがOT IN句から値を渡すためにそれを使用できるように、このテーブル型のパラメータを持つべきです。

以下は、テーブルタイプをパラメータとして使用する単純なStored Procです。

ここ
CREATE PROCEDURE dbo.SelectToken 
    @List AS dbo.ValueList READONLY 
AS 
BEGIN 
    SET NOCOUNT ON; 

    SELECT * From Token WHERE UserId IN (SELECT strValue FROM @List) 
END 
GO 

@List以前に作成したタイプValueListのパラメータです。選択クエリでは、サブクエリを使用して@Listの値を取得し、INに渡します。

以下は、テーブル値パラメータを渡してこのストアドプロシージャを呼び出すC#コードです。

public static List<string> GetTokensForUsers(List<string> userIds) 
{ 

    //Prepare table structure to be passed to the command as parameter. 
    DataTable tvp = new DataTable(); 
    var dc = new DataColumn("strValue", typeof(string)); 
    tvp.Columns.Add(dc); 

    //Add values to the table which will be used in the stored proc. 
    foreach (var userId in userIds) 
    { 
     var dr = tvp.NewRow(); 
     dr["strValue"] = userId; 
     tvp.Rows.Add(dr); 
    } 

    var tokens = new List<string>(); 

    using (var conn = new SqlConnection("Data Source=MyServer;Initial Catalog=MyDb;user id=username;password=pwd")) 
    { 
     SqlCommand cmd = new SqlCommand("dbo.SelectToken", conn); 
     cmd.CommandType = CommandType.StoredProcedure; 
     //Pass table as parametr to the command. 
     SqlParameter tvparam = cmd.Parameters.AddWithValue("@List", tvp); 
     //Setting Type of the parameter. 
     tvparam.SqlDbType = SqlDbType.Structured; 
     conn.Open(); 

     var reader = cmd.ExecuteReader(); 

     while (reader.Read()) 
     { 
      tokens.Add(reader.GetString(1)); 
     } 

    } 
    return tokens; 
} 

私はサンプルユースケースとコードを提供しました。要件に直接適合しない可能性がありますが、これにより問題の解決方法の方向性を示すことができます。

+0

ありがとう、私はこの方法を試してみます。 –

関連する問題