2017-08-17 4 views
0

Ich arbeite derzeit mit Dapper, um Daten von Sql-Server in Textfelder anzuzeigen. Ich habe diese beiden Tabellen:Verwenden von zwei SELECT-Anweisungen aus zwei verschiedenen Tabellen

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

tabelle1

id | fname | lname | Age 
1 | cal | vin | 50 
2 | calvin | cal | 25 

table2

Und meine gespeicherte Prozedur sieht wie folgt aus:

@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 

Ich bin der erste Name in Form Einfügen in der Textbox und es zeigt den Namen und das Alter an. Ich mag die resultierende Tabelle lname aus table1 und Alter von table2, so etwas umfassen:

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

Meine C# Funktion:

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(); 

und Client-Klasse:

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

I‘ Erhalten dieser Fehler:

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. 

wies ich den Cursor auf Leser und es sagt, null und die Ausführung abbricht

ANTWORT: Ive hat dieses und es funktioniert perfekt:

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

Union alle? du schaust? –

+2

mysql <> sqlserver – scsimon

+0

@KannanKandasamy es auch nicht funktioniert. Ich versuche, zwei verschiedene Datensätze aus zwei verschiedenen Tabellen zu erhalten und sie im Formular mit mehreren Select-Anweisungen anzuzeigen – Calvin

Antwort

0

Verwenden folgende 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

aktualisiert Es gibt immer noch: Prozedur oder Funktion 'Multi' erwartet Parameter '@Fname', die nicht geliefert wurde. – Calvin

+0

Dies ist nicht gültig sql. Sie vermissen eine Erstellungs-Prozedur und Sie können nicht == in Tsql verwenden. Nicht wirklich sicher, was das überhaupt versucht zu erreichen. –

+0

Ich weiß, dass ich alle Fehler modifiziert habe. Ich denke, ich bleibe mit meinem ursprünglichen sp – Calvin

Verwandte Themen