2017-08-17 2 views
0

Je travaille actuellement avec Dapper pour afficher les données du serveur SQL dans des zones de texte. Je ces deux tableaux:Utilisation de deux instructions SELECT à partir de deux tables différentes

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

table1

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

table2

et mon proc stocké ressemble à ceci:

@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 

je suis insérer le premier nom sous forme dans la zone de texte et il affichera le nom et l'âge. Je veux que le tableau résultant d'inclure lname de table1 et l'âge de table2, quelque chose comme ceci:

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

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

et classe client:

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

Je m obtenir ces erreurs:

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. 

je l'ai souligné le curseur sur lecteur et il dit nulle et l'exécution Abandonner une

RÉPONSE: Ive a ajouté ceci et cela fonctionne parfaitement:

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 tout? vous cherchez? –

+2

mysql <> sqlserver – scsimon

+0

@KannanKandasamy cela n'a pas fonctionné non plus. J'essaie d'obtenir deux enregistrements différents à partir de deux tables différentes et de les afficher sous la forme en utilisant plusieurs déclarations de sélection – Calvin

Répondre

0

Utilisation sql suivante:

@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

Il donne encore: La procédure ou la fonction 'multi' attend le paramètre '@Fname', qui n'a pas été fourni. – Calvin

+0

Ceci n'est pas valide SQL. Il vous manque une procédure de création et vous ne pouvez pas utiliser == dans tsql. Pas vraiment sûr de ce que cela essaie même d'accomplir. –

+0

Je sais que j'ai modifié toutes les erreurs. Je suppose que je colle avec mon sp original – Calvin