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,因此下面的行不会被执行。我不禁想知道,一个总是至少执行一次的不同类型的循环是否能解决这个问题。。。