Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ADO.NET动态执行多个查询_C#_.net_Database_Ado.net_Odbc - Fatal编程技术网

C# ADO.NET动态执行多个查询

C# ADO.NET动态执行多个查询,c#,.net,database,ado.net,odbc,C#,.net,Database,Ado.net,Odbc,我正在做一个小应用程序,用户输入一个查询块,然后执行它们 问题是,我想显示相关信息,例如,如果他输入以下内容: SELECT * FROM server; UPDATE server SET name = 'Kojak'; 它得到: 选定的行 受更新影响的行数 我的打印循环看起来像: reader = cmd.ExecuteReader(); do { while (reader.Read()) { if (!(reader.RecordsAffected &

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

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

SELECT * FROM server;
UPDATE server SET name = 'Kojak';
它得到:

  • 选定的行
  • 受更新影响的行数
  • 我的打印循环看起来像:

    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");
    
    reader=cmd.ExecuteReader();
    做
    {
    while(reader.Read())
    {
    如果(!(reader.RecordsAffected>0))
    {
    对于(int i=0;i
    问题是我无法区分选择和更新,因为reader.Read()在到达第二个查询时返回FALSE。 当有更新/删除/插入查询时,我如何解决这个问题并能够获得受影响的行数


    谢谢。

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


    我想您需要解析SQL语句列表以确定它是哪种类型的comamnd(例如,
    选择
    更新
    ),并调用相应的方法。

    @David:我是这样做的:

    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;
    }
    
    public int Execute(字符串块,dbStudio.components.DbsTab主机)
    {
    这个.Connect();
    DbCommand cmd=this.dbConnection.CreateCommand();
    DbDataReader=null;
    cmd.CommandText=block;
    int-ret=-1;
    尝试
    {
    长刻度=DateTime.Now.ticks;
    reader=cmd.ExecuteReader();
    做
    {
    while(reader.Read())
    {
    字符串str=“”;
    对于(int i=0;i
    该死的。。。这就是我害怕的。。。谢谢你,大卫。顺便说一下,我仍然可以使用ExecuteReader,也可以获取受影响的行值,但只要执行单个语句,就会引发该值,因此无法知道例如哪个查询生成了多少受影响的行。在JDBC中,这是可能的。。如果你说ExecuteReader()实际上会执行一个非选择查询(我从未尝试过),那么我的答案是错误的。我想问题在于,对于非查询,ExecuteReader()返回false,因此下面的行不会被执行。我不禁想知道,一个总是至少执行一次的不同类型的循环是否能解决这个问题。。。