.NET链接Oracle 参数绑定问题

摘要:
最后,通过故障排除,发现没有添加参数绑定。您需要设置设置属性BindByName=true;OracleHelper1publicclassOracleHelper2{3///<summary>4///测试连接字符串5///</summary>6///<paramname=“connectionString”>˂/param>7///<return>8 publicstaticbolTestConn9{10 using11{12 try13{14 connection.Open();15 returntrue;16}17 catch18{19 connection.Close();20//throw;21 returnfalse;22}23最终24{25 connect()connection.Clos());26}27}28}2930////<汇总>31///执行查询语句,返回SqlDataReader32////33////34////查询语句35////SqlDataReader36publicstaticOracleDataReaderExecuteReader37{38OracleConnectionconnection=newOracleConnection;39OracleCommandcmd=newOracleCommand;40try41{42connection.Open();43OracleDataReadermyReader=cmd.ExecuteReader;44returnmyReader;45}46catch47{48throw;49}5051}5253///<summary>54//执行查询语句,返回SqlDataReader 55/////56////查询语句57//58//59//SqlDataReader60publicstaticOracleDataReader ExecuteReader61{62OracleConnectionconnection=newOracleConnection;63OracleCommandcmd=newOracleCommand();64try65{66PrepareCommand;67OracleDataReadermyReader=cmd.ExecuteReader;68cmd.Parameters.Clear();69returnmyReader;70}71catch72{73抛出器;74}75//finally76//{77//cmd.Dispose();78//connection.Close();79//}8081}8283privatestaticvoidPrepareCommand84{85if(conn.State!

在.NET项目中链接Oracle使用的驱动是 Oracle.ManagedDataAccess.dll ,这里下载

所遇到的问题

使用存储过程一个参数没有问题,发现两个或两个以上会有参数没传过来的现象。

最后通过排查发现是没有添加参数绑定(问题找了好长时间,刚开始还以为驱动的问题+_+)。

需要设置设置属性 BindByName = true;

下面附上 OracleHelper

  1 public class OracleHelper
  2     {
  3         /// <summary>
  4         /// 测试连接字符串
  5         /// </summary>
  6         /// <param name="connectionString"></param>
  7         /// <returns></returns>
  8         public static bool TestConn(string connectionString)
  9         {
 10             using (OracleConnection connection = new OracleConnection(connectionString))
 11             {
 12                 try
 13                 {
 14                     connection.Open();
 15                     return true;
 16                 }
 17                 catch (OracleException e)
 18                 {
 19                     connection.Close();
 20                     //throw e;
 21                     return false;
 22                 }
 23                 finally
 24                 {
 25                     connection.Close();
 26                 }
 27             }
 28         }
 29 
 30         /// <summary>
 31         /// 执行查询语句,返回SqlDataReader ( 注意:调用该方法后,一定要对SqlDataReader进行Close )
 32         /// </summary>
 33         /// <param name="connectionString"></param>
 34         /// <param name="strSQL">查询语句</param>
 35         /// <returns>SqlDataReader</returns>
 36         public static OracleDataReader ExecuteReader(string connectionString, string strSQL)
 37         {
 38             OracleConnection connection = new OracleConnection(connectionString);
 39             OracleCommand cmd = new OracleCommand(strSQL, connection);
 40             try
 41             {
 42                 connection.Open();
 43                 OracleDataReader myReader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
 44                 return myReader;
 45             }
 46             catch (OracleException e)
 47             {
 48                 throw e;
 49             }
 50 
 51         }
 52 
 53         /// <summary>
 54         /// 执行查询语句,返回SqlDataReader ( 注意:调用该方法后,一定要对SqlDataReader进行Close )
 55         /// </summary>
 56         /// <param name="SQLString">查询语句</param>
 57         /// <param name="connectionString"></param>
 58         /// <param name="cmdParms"></param>
 59         /// <returns>SqlDataReader</returns>
 60         public static OracleDataReader ExecuteReader(string connectionString, string SQLString, List<OracleParameter> cmdParms)
 61         {
 62             OracleConnection connection = new OracleConnection(connectionString);
 63             OracleCommand cmd = new OracleCommand();
 64             try
 65             {
 66                 PrepareCommand(cmd, connection, null, SQLString, cmdParms);
 67                 OracleDataReader myReader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
 68                 cmd.Parameters.Clear();
 69                 return myReader;
 70             }
 71             catch (OracleException e)
 72             {
 73                 throw e;
 74             }
 75             //            finally
 76             //            {
 77             //                cmd.Dispose();
 78             //                connection.Close();
 79             //            }    
 80 
 81         }
 82 
 83         private static void PrepareCommand(OracleCommand cmd, OracleConnection conn, OracleTransaction trans, string cmdText, List<OracleParameter> cmdParms)
 84         {
 85             if (conn.State != ConnectionState.Open)
 86                 conn.Open();
 87             cmd.Connection = conn;
 88             cmd.CommandText = cmdText;
 89             if (trans != null)
 90                 cmd.Transaction = trans;
 91             cmd.CommandType = CommandType.Text;//cmdType;
 92             if (cmdParms != null)
 93             {
 94                 cmd.BindByName = true;
 95                 foreach (OracleParameter parameter in cmdParms)
 96                 {
 97                     if ((parameter.Direction == ParameterDirection.InputOutput || parameter.Direction == ParameterDirection.Input) &&
 98                         (parameter.Value == null))
 99                     {
100                         parameter.Value = DBNull.Value;
101                     }
102                     cmd.Parameters.Add(parameter);
103                 }
104             }
105         }
106 
107         /// <summary>
108         /// 执行查询语句,返回DataSet
109         /// </summary>
110         /// <param name="SQLString">查询语句</param>
111         /// <returns>DataSet</returns>
112         public static DataSet Query(string connectionString, string SQLString, List<OracleParameter> cmdParms)
113         {
114             using (OracleConnection connection = new OracleConnection(connectionString))
115             {
116                 OracleCommand cmd = new OracleCommand();
117                 PrepareCommand(cmd, connection, null, SQLString, cmdParms);
118                 using (OracleDataAdapter da = new OracleDataAdapter(cmd))
119                 {
120                     DataSet ds = new DataSet();
121                     try
122                     {
123                         da.Fill(ds, "ds");
124                         cmd.Parameters.Clear();
125                     }
126                     catch (OracleException ex)
127                     {
128                         throw new Exception(ex.Message);
129                     }
130                     return ds;
131                 }
132             }
133         }
134 
135         /// <summary>
136         /// 执行查询语句,返回DataSet
137         /// </summary>
138         /// <param name="SQLString">查询语句</param>
139         /// <returns>DataSet</returns>
140         public static DataSet Query(string connectionString, string SQLString)
141         {
142             using (OracleConnection connection = new OracleConnection(connectionString))
143             {
144                 DataSet ds = new DataSet();
145                 try
146                 {
147                     connection.Open();
148                     OracleDataAdapter command = new OracleDataAdapter(SQLString, connection);
149                     command.Fill(ds, "ds");
150                 }
151                 catch (OracleException ex)
152                 {
153                     throw new Exception(ex.Message);
154                 }
155                 return ds;
156             }
157         }
158 
159         //public static DataTable QueryDataTable(string connectionString, string SQLString)
160         //{
161         //    return Query(connectionString, SQLString).Tables[0];
162         //}
163 
164         public static DataTable QueryDataTable(string connectionString, string SQLString, List<JsonParamModel> jsonModels)
165         {
166             if (jsonModels.Count == 0)
167             {
168                 return Query(connectionString, SQLString).Tables[0];
169             }
170             var paramsList = new List<OracleParameter>();
171 
172             foreach (var json in jsonModels)
173             {
174                 //var sqlParameter = new SqlParameter(string.Format("@{0}", json.paramName), SqlDbType.Variant);
175                 //ParamAssignment(ref sqlParameter, json);
176                 var sqlParameter = new OracleParameter(string.Format(":{0}", json.paramName), json.paramValue);//@号调整成 :号
177                 //ParamAssignment(ref sqlParameter, json);
178                 paramsList.Add(sqlParameter);
179             }
180 
181             return Query(connectionString, SQLString, paramsList).Tables[0];
182         }
183 
184         private static void ParamAssignment(ref OracleParameter param, JsonParamModel jsonParamModel)
185         {
186             var dbType = jsonParamModel.paramDbType;
187             var value = jsonParamModel.paramValue;
188             switch (dbType)
189             {
190                 case "SqlDbType.DateTime":
191                     param.Value = DateTime.Parse(value);
192                     break;
193                 case "SqlDbType.UniqueIdentifier":
194                     param.Value = Guid.Parse(value);
195                     break;
196                 case "SqlDbType.Int":
197                     param.Value = int.Parse(value);
198                     break;
199                 default:
200                     param.Value = value;
201                     break;
202             }
203         }
204 
205         /// <summary>
206         /// 执行SQL语句,返回影响的记录数
207         /// </summary>
208         /// <param name="SQLString">SQL语句</param>
209         /// <returns>影响的记录数</returns>
210         public static int ExecuteSql(string connectionString, string SQLString)
211         {
212             using (OracleConnection connection = new OracleConnection(connectionString))
213             {
214                 using (OracleCommand cmd = new OracleCommand(SQLString, connection))
215                 {
216                     try
217                     {
218                         connection.Open();
219                         int rows = cmd.ExecuteNonQuery();
220                         return rows;
221                     }
222                     catch (OracleException e)
223                     {
224                         connection.Close();
225                         throw e;
226                     }
227                 }
228             }
229         }
230 
231         /// <summary>
232         /// 执行SQL语句,返回影响的记录数
233         /// </summary>
234         /// <param name="SQLString">SQL语句</param>
235         /// <returns>影响的记录数</returns>
236         public static int ExecuteSql(string connectionString, string SQLString, List<OracleParameter> cmdParms)
237         {
238             using (OracleConnection connection = new OracleConnection(connectionString))
239             {
240                 using (OracleCommand cmd = new OracleCommand())
241                 {
242                     try
243                     {
244                         cmd.BindByName = true;
245 
246                         PrepareCommand(cmd, connection, null, SQLString, cmdParms);
247                         int rows = cmd.ExecuteNonQuery();
248                         cmd.Parameters.Clear();
249                         return rows;
250                     }
251                     catch (System.Data.SqlClient.SqlException e)
252                     {
253                         throw e;
254                     }
255                 }
256             }
257         }
258 
259         public static int ExecuteSql(string connectionString, string SQLString, List<JsonParamModel> jsonModels)
260         {
261             if (jsonModels.Count == 0)
262             {
263                 return ExecuteSql(connectionString, SQLString);
264             }
265 
266             var paramsList = new List<OracleParameter>();
267 
268             foreach (var json in jsonModels)
269             {
270                 //var sqlParameter = new SqlParameter(string.Format("@{0}", json.paramName), SqlDbType.Variant);
271                 //ParamAssignment(ref sqlParameter, json);
272                 var sqlParameter = new OracleParameter(string.Format(":{0}", json.paramName), json.paramValue);
273                 //ParamAssignment(ref sqlParameter, json);
274                 paramsList.Add(sqlParameter);
275             }
276 
277             return ExecuteSql(connectionString, SQLString, paramsList);
278         }
279     }

免责声明:文章转载自《.NET链接Oracle 参数绑定问题》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇引入类,调用方法对umi的研究下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Oracle Forms Services Architecture

Oracle Forms Services Architecture Author:                         PTIAN(tianpan@gmail.com) Creation Date:            05/01/2012 Last Updated:              Version:             ...

jsp、javabean、el

JSP三大指令一个jsp页面中,可以有0~N个指令的定义!1. page --> 最复杂:<%@page language="java" info="xxx"...%>* pageEncoding和contentType:> pageEncoding:它指定当前jsp页面的编码,只要不说谎,就不会有乱码!在服务器要把jsp编译成.j...

mysql和Oracle在对clob和blob字段的处理

一、MySQL与Oracle数据库如何处理Clob,Blob数据类型 (1)不通数据库中对应clob,blob的类型如下: MySQL中:clob对应text,blob对应blob DB2/Oracle中:clob对应clob,blob对应blob (2)domain中对应的类型: clob对应String,blob对应byte[] clob对应ja...

C#通过SFTP协议操作文件

本文主要是C#调用SSH实现文件上传下载功能,主要是要引用第三方类库Tamir.SharpSSH.dll。 以下是SFTPHelper类,实现了对文件的操作,可供参考。 public classSFTPHelper { privateSession m_session; privateChannel m_chann...

微信APP支付(Java后台生成签名具体步骤)

public class PayCommonUtil { //定义签名,微信根据参数字段的ASCII码值进行排序 加密签名,故使用SortMap进行参数排序public static String createSign(String characterEncoding,SortedMap<String,String> parameter...

IDEA创建SpringBoot项目整合JPA,连接Oracle数据库,使用Swagger进行测试

一、信息 IDEA  2019.1 jdk   1.8 Oracle  11.2.0.1.0 二、创建Spring Boot项目 1、选择JDK 2、根据你的公司名填写Group名,Artifact名不能包含大写,IDEA会报告含有非法字符,这一点挺奇怪的 3、选择依赖,这里我们选择Spring Data JPA和Spring Web,点击next 4...