代码之家  ›  专栏  ›  技术社区  ›  CoolStraw

ADO.NET动态执行多个查询

  •  0
  • CoolStraw  · 技术社区  · 14 年前

    我正在做一个小应用程序,用户输入一个查询块,然后执行它们。

    问题是我想显示相关信息,例如,如果他输入如下内容:

    SELECT * FROM server;
    UPDATE server SET name = 'Kojak';
    

    它得到:

    1. 选定的行
    2. 受更新影响的行数

    我的打印循环看起来像:

    reader = cmd.ExecuteReader();
    do
    {
    
        while (reader.Read())
        {
            if (!(reader.RecordsAffected > 0))
            {
                for (int i = 0; i < reader.FieldCount; i++)
                    host.WriteLine("Field " + i + ": " + reader[i].ToString());
            }
            else {
                host.WriteLine(reader.RecordsAffected.ToString() + " Affected rows.");
            }
        }                    
    } while (reader.NextResult());
    host.WriteLine("Block executed successfuly");
    

    问题是我无法区分select和UPDATEs,因为reader.Read()在到达第二个查询时返回FALSE。 当有一个更新/删除/插入查询时,我如何解决这个问题并获得受影响的行数?

    谢谢。

    2 回复  |  直到 14 年前
        1
  •  1
  •   David    14 年前

    你不能用 cmd.ExecuteReader() 执行非查询。你需要使用 ExecuteNonQuery() .

    我想您需要解析SQL语句列表来确定它是哪种类型的命令(例如。 SELECT UPDATE ),并调用相应的方法。

        2
  •  0
  •   abatishchev Marc Gravell    14 年前

    @大卫:我是这样做的:

    public int Execute(String block, dbStudio.components.DbsTab host)
    {
        this.Connect();
        DbCommand cmd = this.dbConnection.CreateCommand();
        DbDataReader reader = null;
    
        cmd.CommandText = block;
        int ret = -1;
    
        try
        {
            long ticks = DateTime.Now.Ticks;
            reader = cmd.ExecuteReader();
            do
            {
                while (reader.Read())
                {
                    String str = "";
                    for (int i = 0; i < reader.FieldCount; i++)
                    {
                        //host.WriteLine("Field " + i + ": " + reader[i].ToString());
                        str = str + reader[i].ToString() + "    ";
                    }
                    host.WriteLine(str);
                }
            } while (reader.NextResult());
    
            host.WriteLine("Block executed successfuly");
            host.WriteLine(reader.RecordsAffected.ToString() + " Affected rows.");
            host.WriteLine(((DateTime.Now.Ticks - ticks) / 1000).ToString() + "ms");
    
            ret = reader.RecordsAffected;
        }
        catch (Exception e)
        {
            host.WriteLine(e.Message);
        }
        finally
        {
            this.Disconnect();
        }
        return ret;
    }