2017-08-17 19 views
0

現在、Dapperを使用してSQL Serverのデータをテキストボックスに表示しています。2つの異なるテーブルから2つのSELECTステートメントを使用する

id | fname | lname | Age 
1 | cal | bla | 100 
2 | vin | bla | 10 

TABLE1

table2の

id | fname | lname | Age 
1 | cal | vin | 50 
2 | calvin | cal | 25 
そして、私のストアドプロシージャは、次のようになります:

@Fname nvarchar(50) 
AS 
BEGIN 
SELECT Fname,Lname,Age FROM table1 WHERE [email protected] 
UNION 
SELECT Fname,Lname,Age FROM table2 WHERE [email protected] 
END 

私は、フォームの最初の名前を挿入するよ私はこれらの2つのテーブルを持っていますテキストボックスにlnameとageが表示されます。

id | fname | lname | Age 
1 | calvin | bla | 50 

私のC#の機能::

public void Multi(String name) 
    { 
     try 
     { 
      using (IDbConnection db = new SqlConnection(ConfigurationManager.ConnectionStrings["SqlConnectionString"].ConnectionString)) 
      { 
       if (db.State != ConnectionState.Open) 
        db.Open(); 

       DynamicParameters p = new DynamicParameters(); 
       SqlCommand command = new SqlCommand("multi", con); 
       p.Add("@Fname", tb2.Text, 
       DbType.String,ParameterDirection.Input); 

       var multi = con.QueryMultiple("multi", p, commandType: 
       CommandType.StoredProcedure); 
       clients cls = new clients(); 
       cls.C = multi.Read<Client>().ToList(); 
       var cli = multi.Read<clients>().ToList(); 
       SqlDataReader reader = command.ExecuteReader(); 
       while (reader.Read()) 
       { 
        cls.C.Add(new Client() 
        { 
         Fname = (String)reader["Fname"], 
         Lname = (String)reader["Lname"], 
         Age = (int)reader["Age"] 
        }); 
        tb2.Text = cls.C[0].Fname; 
        tb3.Text = cls.C[0].Lname; 
        tb4.Text = cls.C[0].Age.ToString(); 

とクライアントクラス:

class Client 
    { 
    public string Fname { get; set; } 
    public string Lname { get; set; } 
    public int Age { get; set; } 
    } 
    class clients 
    { 
    public List<Client> C = new List<Client>(); 
    } 

私は」私は、結果のテーブルは表2からTABLE1と年齢からLNAMEを含めるには、このような何かしたいですこれらのエラーが発生する:

1-Procedure or function 'multi' expects parameter '@Fname', which was not 
supplied. 
2-The reader has been disposed; this can happen after all data has been 
consumed Object name: 'Dapper.SqlMapper+GridReader'. 
3- An explicit value for the identity column in table 'CloneInfo' can only 
be specified when a column list is used and IDENTITY_INSERT is ON. 

私は読者の上にカーソルを指摘し、それがnullで言うと実行が途切れ

ANSWER: アイブ氏はこれを追加し、それが完璧に動作します:

DynamicParameters p = new DynamicParameters(); 
       p.Add("@Fname", tb2.Text); 
       var multi = con.QueryMultiple("multi", p, commandType: CommandType.StoredProcedure); 

       clients cls = new clients(); 
       clients cls2 = new clients(); 

       cls.C = multi.Read<Client>().ToList(); 
       cls2.C = multi.Read<Client>().ToList(); 

       tb2.Text = cls.C[0].Fname; 
       tb3.Text = cls.C[0].Lname; 
       tb4.Text = cls2.C[0].Age.ToString(); 

       if (db.State != ConnectionState.Closed) 
        db.Close();.C[0].Age.ToString(); 
+0

をすべての連合?あなたは見ている? –

+2

mysql <> sqlserver – scsimon

+0

@KannanKandasamyそれもうまくいきませんでした。私は2つの異なるテーブルから2つの異なるレコードを取得し、複数の選択ステートメントを使用してそれらをフォームで表示しようとしています – Calvin

答えて

0

使用次のSQL:

@Fname nvarchar(50) 
AS 
BEGIN 
if ((select count(*) from table1 where [email protected]) > 0) 
begin 
    select t1.Fname, t1.Lname, t2.Age 
    from table1 as t1 
    left join table2 as t2 on t1.Fname == t2.Fname 
    where t1.Fname = @Fname 
end 
else 
begin 
    select t2.Fname, t1.Lname, t2.Age 
    from table2 as t2 
    left join table1 as t1 on t2.Fname == t1.Fname 
    where t2.Fname = @Fname 
end 
+0

それでも:プロシージャまたは関数 'multi'はパラメータ '@Fname'が必要ですが、これは提供されませんでした。 – Calvin

+0

これは有効なSQLではありません。作成プロシージャがないため、tsqlで==を使用できません。これが達成しようとしていることすらわからない。 –

+0

私はすべてのエラーを修正したことを知っています。私は私の元のspをつけていると思う – Calvin

関連する問題