【问题标题】:Using two SELECT statements from two different tables使用来自两个不同表的两个 SELECT 语句
【发布时间】:2018-01-25 23:02:44
【问题描述】:

我目前正在使用 Dapper 将 Sql 服务器中的数据显示到文本框中。我有这两张表:

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

表1

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

表2

我的存储过程如下所示:

@Fname nvarchar(50)
AS
BEGIN
SELECT Fname,Lname,Age FROM table1 WHERE Fname=@Fname 
UNION
SELECT Fname,Lname,Age FROM table2 WHERE Fname=@Fname
END

我在文本框中的表单中插入名字,它将显示 lname 和年龄。我希望生成的表包含 table1 中的 lname 和 table2 中的年龄,如下所示:

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

我收到以下错误:

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.

我将光标指向 reader,它显示为 null,执行中断

回答: 我已经添加了这个,它工作得很好:

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

【问题讨论】:

  • 联合所有?你在找吗?
  • mysql sqlserver
  • @KannanKandasamy 它也没有用。我正在尝试从两个不同的表中获取两个不同的记录,并使用多个 select 语句以表单形式显示它们
  • 什么没用?
  • 我已经用我遇到的错误更新了帖子。我无法在文本框中显示记录

标签: c# mysql sql-server dapper


【解决方案1】:

使用下面的sql:

@Fname nvarchar(50)
AS
BEGIN
if ((select count(*) from table1 where Fname=@Fname) > 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

【讨论】:

  • 它仍然给出:过程或函数'multi'需要参数'@Fname',但未提供。
  • 这是无效的 sql。您缺少创建过程,并且不能在 tsql 中使用 ==。不确定这甚至试图完成什么。
  • 我知道我修改了所有的错误。我想我坚持我原来的 sp
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多