如何一次执行两条SQL语句?

极品司机 2003-05-19 03:08:25
如何一次执行两条SQL语句?

数据库为Oracle9.2.0

//////////////////////////////////////////////////////////////////////////////////////////////////////////////
//建立连接
string ConnectionString = "Provider=MSDAORA.1;Password=forrest;User ID=forrest;Data Source=oratest";
OleDbConnection myConnection = new OleDbConnection(ConnectionString);
myConnection.Open();

//生成SQL语句
string strCreateUser = "CREATE USER " + txtUserName.Text.Trim() + " IDENTIFIED BY " + txtPassword.Text.Trim();
string strGrantRoles = "GRANT connect, resource TO " + txtUserName.Text.Trim().ToUpper();

////如下,分别执行两条语句是没有错误的
// OleDbCommand cmdCreateUser = new OleDbCommand(strCreateUser, myConnection);
// OleDbCommand cmdGrantRoles = new OleDbCommand(strGrantRoles, myConnection);
// cmdCreateUser.ExecuteNonQuery();
// cmdGrantRoles.ExecuteNonQuery();

//如下,将两条SQL语句以分号连接后,则不能成功执行
string strCreateUserGrantRoles = strCreateUser + " ; " + strGrantRoles;
OleDbCommand cmdCreateUserGrantRoles = new OleDbCommand(strCreateUserGrantRoles, yConnection);
cmdCreateUserGrantRoles.ExecuteNonQuery();

//关闭连接
myConnection.Close();
//////////////////////////////////////////////////////////////////////////////////////////////////////////////

在一次执行多条SQL语句的情况下是不是应使用存储过程?
在此例中存储过程应如何书写?
盼请高手指点。
...全文
970 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
极品司机 2003-05-19
  • 打赏
  • 举报
回复
To: nmgrlt(nmgrlt)
以空格分隔不行。

To:zhuohs(凌九霄)
你用到了事务处理,并非存储过程。

To: TonyJoule(寒星㊣)
“批处理”如何做?能否写详细些?

To:tanrui(Tanruy)
存储过程应如何写?MSDN上全是关于SQL Server的例子,我想知道Oracle的如何写,或是标准SQL的写法。

To:Happyboy_zjy(阳光男孩) & yqdeng(享受生活每一天)
我之前就是用分号分隔,不行。
asam2183 2003-05-19
  • 打赏
  • 举报
回复
用存储过程不就解决了吗?要想那么多
CSTerry 2003-05-19
  • 打赏
  • 举报
回复
用存储过程
yqdeng 2003-05-19
  • 打赏
  • 举报
回复
用“;”格开就可以了,不用这么复杂
Happyboy_zjy 2003-05-19
  • 打赏
  • 举报
回复
应该用;隔开就可以了吧
gujianxin 2003-05-19
  • 打赏
  • 举报
回复
//同意上面诸兄所言,但写语句还是有其灵活性的,如:想在主次表中同时插入
//可以直接修改命令代码,以实现目的
//请注意标记**的地方

//////////////////////////////////////////////////////////////////////////////////////////////////////////////
//建立连接
string ConnectionString = "Provider=MSDAORA.1;Password=forrest;User ID=forrest;Data Source=oratest";
OleDbConnection myConnection = new OleDbConnection(ConnectionString);
myConnection.Open();

//生成SQL语句
string strCreateUser = "CREATE USER " + txtUserName.Text.Trim() + " IDENTIFIED BY " + txtPassword.Text.Trim();
string strGrantRoles = "GRANT connect, resource TO " + txtUserName.Text.Trim().ToUpper();

////如下,分别执行两条语句是没有错误的
// OleDbCommand cmdCreateUser = new OleDbCommand(strCreateUser, myConnection);
// OleDbCommand cmdGrantRoles = new OleDbCommand(strGrantRoles, myConnection);
// cmdCreateUser.ExecuteNonQuery();
// cmdGrantRoles.ExecuteNonQuery();

//如下,将两条SQL语句以分号连接后,则不能成功执行
string strCreateUserGrantRoles = strCreateUser ;//+ " ; " + strGrantRoles;
OleDbCommand cmdCreateUserGrantRoles = new OleDbCommand(strCreateUserGrantRoles, yConnection);
cmdCreateUserGrantRoles.ExecuteNonQuery();
//**改变命令行 **
cmdCreateUserGrantRoles.CommandText = strGrantRoles;
cmdCreateUserGrantRoles.ExecuteNonQuery();

//关闭连接
myConnection.Close();
tanrui 2003-05-19
  • 打赏
  • 举报
回复
写一个存储过程不上很轻松就解决了吗?何必要写怎么多代码呢??
寒星 2003-05-19
  • 打赏
  • 举报
回复
用批处理语句嘛,也是在两条SQL之间加上一个分号。ADO和ADO.NET都支持的。
zhuohs 2003-05-19
  • 打赏
  • 举报
回复
用存储过程就可以,当不能完全执行的时候系统会自动回滚。
在这里给你个例子,希望对你有帮助。
public void RunSqlTransaction(string myConnString)
{
SqlConnection myConnection = new SqlConnection(myConnString);
myConnection.Open();

SqlCommand myCommand = new SqlCommand();
SqlTransaction myTrans;

// Start a local transaction
myTrans = myConnection.BeginTransaction(IsolationLevel.ReadCommitted,"SampleTransaction");
// Must assign both transaction object and connection
// to Command object for a pending local transaction
myCommand.Connection = myConnection;
myCommand.Transaction = myTrans;

try
{
myCommand.CommandText = "Insert into Region (RegionID, RegionDescription) VALUES (100, 'Description')";
myCommand.ExecuteNonQuery();
myCommand.CommandText = "Insert into Region (RegionID, RegionDescription) VALUES (101, 'Description')";
myCommand.ExecuteNonQuery();
myTrans.Commit();
Console.WriteLine("Both records are written to database.");
}
catch(Exception e)
{
myTrans.Rollback("SampleTransaction");
Console.WriteLine(e.ToString());
Console.WriteLine("Neither record was written to database.");
}
finally
{
myConnection.Close();
}
}
nmgrlt 2003-05-19
  • 打赏
  • 举报
回复
中间用空格而不是分号。
也可以在存储过程中写。
jiezhi 2003-05-19
  • 打赏
  • 举报
回复
一次只能执行一条语句.你别想了.

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧