读书人

asp.net(c#) 执行sql和参数赋值得有关

发布时间: 2012-02-03 22:02:47 作者: rapoo

asp.net(c#) 执行sql和参数赋值得问题
using (SqlConnection conn = new SqlConnection(Resources.Resource.ConnString))
{
conn.Open();
string typeid = "1 ";
using(SqlCommand comm = new SqlCommand ( "select * from vvmessage where typeid=@typeid order by createtime desc ",conn))
{
comm.Parameters.AddWithValue( "@typeid ", typeid);
using(SqlDataReader dr = comm.ExecuteReader())
{
Response .Write (dr.HasRows );
}
}
}
这段代码运行正常,

但放到 orcle数据库上,用以下代码,就报错了呢?

using (OleDbConnection conn = new OleDbConnection(Resources.Resource.ConnectionString))
{
conn.Open();
string typeid = "1 ";
using (OleDbCommand comm = new OleDbCommand ( "select * from vvmessage where typeid=@typeid order by createtime desc ", conn))
{
comm.Parameters.AddWithValue( "@typeid ", typeid);
using (OleDbDataReader dr = comm.ExecuteReader())
{
Response.Write(dr.HasRows);
}
}
}

ORA-00936: missing expression


说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。

异常详细信息: System.Data.OleDb.OleDbException: ORA-00936: missing expression

源错误:


行 22: {
行 23: comm.Parameters.AddWithValue( "@typeid ", typeid);
行 24: using (OleDbDataReader dr = comm.ExecuteReader())
行 25: {
行 26: Response.Write(dr.HasRows);


源文件: e:\Default2.aspx.cs 行: 24



[解决办法]
oracle不能使用OleDbConnection 、OleDbCommand 、OleDbDataReader

======

可以,此时用 OleDb 去连 Oracle
[解决办法]
对于命令参数,

OleDb 不支持 【命名参数】,使用 ? (问号)作为占位符,
因为你要特别注意,假如多个参数,其进入 ParamerterCollection 的顺序很重要,与要 SQL/Store Procedure 中定义参数顺序一致

》》》

using (OleDbCommand comm = new OleDbCommand ( "select * from vvmessage where typeid=? order by createtime desc ", conn))
{
comm.Parameters.AddWithValue( " ", typeid);
using (OleDbDataReader dr = comm.ExecuteReader())
[解决办法]
Oracle SQL/PL 是支持【命名参数】的,语法是, : (冒号)紧跟参数名
因此假如你使用 OracleClient (microsoft data provider .net for oracle)
或者 ODP.NET (Oracle Data Provider,Oracle 官方提供)

那么 -》

// OracleClient
sing (OracleCommand comm = new OracleDbCommand ( "select * from vvmessage where typeid=:typeid order by createtime desc ", conn))
{
comm.Parameters.AddWithValue( ":typeid ", typeid);
// OR
// comm.Parameters.AddWithValue( "typeid ", typeid);
using (OracleDataReader dr = comm.ExecuteReader())


关于三个 Data Provider 的区别,当然主要再性能上,
用脚丫子都可以想到,整体上是

ODP.net > OralceClient > OleDb

读书人网 >asp.net

热点推荐