>System.Data.OracleClient.dll —— .Net 自带的 已经 过时作废。
> 要链接 Oracle 服务器,必须在 本机安装 Oracle 客户端 —— 而 SQLServer 不需要安装客户端。
win32_11gR2_client.zip ( 652M )
win64_11gR2_client.zip ( 587M )
>Oracle.DataAccess.dll —— Oracle 官方 提供的 .Net 程序集【在安装目录 ODP.NET 中】。
Oracle.DataAccess.dll 严格区分 x32 、 x64 —— 程序集 不是 AnyCPU 。
x32 客户端 只包括 x32 的 Oracle.DataAccess.dll 。
x64 客户端 只包括 x64 的 Oracle.DataAccess.dll 。
发布程序的时候,就很容易在这个地方 出现问题。
C# 调用 Oracle 语法限制
>Oracle 不支持 自增主键 —— 自增主键 需要使用 触发器。
>Oracle 表名,字段名 不能超过 30 个字符。
> 脚本 参数化, 关键符为 : —— SQLServer 关键符为 @
> 脚本 名称区域, 关键符为 " 表名 "." 字段名 " —— SQLServer 关键符为 [ 表名 ].[ 字段名 ]
警告:脚本中 不建议 将 数据库名、表名、字段名 用 引号括起来 —— 后果很严重。
> 支持 多条 修改语句 同时执行:
BEGIN UPDATE TB_Test SET Name = ‘ INK ‘ ; DELETE TB_Test WHERE Name = ‘ INK ‘ ; INSERT INTO TB_Test(Name) VALUES ( ‘ INK ‘ ); END ;
> 不支持 多条 查询语句,得到 DataSet —— 支持 单一查询得到 DataSet 。
> 支持 ExecuteScalar —— 但是 执行脚本 必须是 单条脚本。
> 不支持 插入 & 查询 自增列—— SQLServer 支持 INSERT INTO … . SELECT@@IDENTITY
警告:即使使用 触发器 实现 自增 ID ,以下语法也 无法执行 :
BEGIN INSERT INTO TB_Test(Name) VALUES ( ‘ INK ‘ ); -- 先执行 插入 SELECT MAX (ID) FROMTB_Test; -- 再执行 查询 最大ID END
C# 调用 Oracle 的死结 在于:不支持 多条 非影响 SQL 脚本同时执行。
有鉴于此,自己随手写了一个 OracleHelper.cs
> 之前 Oracle 脚本 , 自然是 支持的。
> 多条 Oracle 脚本,用 ; 分割 —— 即能支持 多条 SQL 脚本。
> 多条 SQL 脚本将自动开启 数据库事务,确保 绝对正确。
> 支持 多条 SELECT 返回 多 DataTable 的 DataSet 。
> 支持 插入 & 查询自增列(触发器实现的 自增列)
代码如下:
1 public static class OracleHelper
2 {
3
4
5
6 public static List<T> ExecuteReaderList<T>( string connString, string cmdText, Func<OracleDataReader, T> funcReader) where T : new ()
7 {
8 return ExecuteReaderList(connString, cmdText, null , funcReader);
9 }
10 public static T ExecuteReaderEntity<T>( string connString, string cmdText, Func<OracleDataReader, T> funcReader) where T : new ()
11 {
12 return ExecuteReaderEntity(connString, cmdText, null , funcReader);
13 }
14 public static int ExecuteNonQuery( string connString, string cmdText)
15 {
16 return ExecuteNonQuery(connString, cmdText, null );
17 }
18 public static object ExecuteScalar( string connString, string cmdText)
19 {
20 return ExecuteScalar(connString, cmdText, null );
21 }
22 public static DataSet ExecuteFillDataSet( string connString, string cmdText)
23 {
24 return ExecuteFillDataSet(connString, cmdText, null );
25 }
26
27
28 public static List<T> ExecuteReaderList<T>( string connString, string cmdText, Action<OracleCommand> cmdAction, Func<OracleDataReader, T> funcReader) where T : new ()
29 {
30 using (OracleConnection conn = new OracleConnection(connString))
31 {
32 TryOpenSqlConnection(conn);
33 return ExecuteReaderList<T>(conn, null , cmdText, cmdAction, funcReader);
34 }
35 }
36 public static T ExecuteReaderEntity<T>( string connString, string cmdText, Action<OracleCommand> cmdAction, Func<OracleDataReader, T> funcReader) where T : new ()
37 {
38 using (OracleConnection conn = new OracleConnection(connString))
39 {
40 TryOpenSqlConnection(conn);
41 return ExecuteReaderEntity<T>(conn, null , cmdText, cmdAction, funcReader);
42 }
43 }
44 public static int ExecuteNonQuery( string connString, string cmdText, Action<OracleCommand> cmdAction)
45 {
46 using (OracleConnection conn = new OracleConnection(connString))
47 {
48 TryOpenSqlConnection(conn);
49 return ExecuteNonQuery(conn, null , cmdText, cmdAction);
50 }
51 }
52 public static object ExecuteScalar( string connString, string cmdText, Action<OracleCommand> cmdAction)
53 {
54 using (OracleConnection conn = new OracleConnection(connString))
55 {
56 TryOpenSqlConnection(conn);
57 return ExecuteScalar(conn, null , cmdText, cmdAction);
58 }
59 }
60 public static DataSet ExecuteFillDataSet( string connString, string cmdText, Action<OracleCommand> cmdAction)
61 {
62 using (OracleConnection conn = new OracleConnection(connString))
63 {
64 TryOpenSqlConnection(conn);
65 return ExecuteFillDataSet(conn, null , cmdText, cmdAction);
66 }
67 }
68
69
70 public static List<T> ExecuteReaderList<T>(OracleConnection conn, OracleTransaction tran, string cmdText, Action<OracleCommand> cmdAction, Func<OracleDataReader, T> funcReader) where T : new ()
71 {
72 List<OracleSingleScript> listScript = SplitOracleScript(cmdText);
73 if (listScript == null || listScript.Count <= 0 || listScript.Count == 1 )
74 {
75 return SingleExecuteReaderList<T> (conn, tran, cmdText, cmdAction, funcReader);
76 }
77 else
78 {
79 OracleBatchResult<T> result = ExecuteBatchScript<T>(conn, tran, listScript, false , cmdAction, funcReader);
80 return result.ExecuteReaderList();
81 }
82 }
83 public static T ExecuteReaderEntity<T>(OracleConnection conn, OracleTransaction tran, string cmdText, Action<OracleCommand> cmdAction, Func<OracleDataReader, T> funcReader) where T : new ()
84 {
85 List<OracleSingleScript> listScript = SplitOracleScript(cmdText);
86 if (listScript == null || listScript.Count <= 0 || listScript.Count == 1 )
87 {
88 return SingleExecuteReaderEntity<T> (conn, tran, cmdText, cmdAction, funcReader);
89 }
90 else
91 {
92 OracleBatchResult<T> result = ExecuteBatchScript<T>(conn, tran, listScript, false , cmdAction, funcReader);
93 return result.ExecuteReaderEntity();
94 }
95 }
96 public static int ExecuteNonQuery(OracleConnection conn, OracleTransaction tran, string cmdText, Action<OracleCommand> cmdAction)
97 {
98 List<OracleSingleScript> listScript = SplitOracleScript(cmdText);
99 if (listScript == null || listScript.Count <= 0 || listScript.Count == 1 )
100 {
101 return SingleExecuteNonQuery(conn, tran, cmdText, cmdAction);
102 }
103 else
104 {
105 OracleBatchResult< object > result = ExecuteBatchScript< object >(conn, tran, listScript, false , cmdAction, null );
106 return result.ExecuteNonQuery();
107 }
108 }
109 public static object ExecuteScalar(OracleConnection conn, OracleTransaction tran, string cmdText, Action<OracleCommand> cmdAction)
110 {
111 List<OracleSingleScript> listScript = SplitOracleScript(cmdText);
112 if (listScript == null || listScript.Count <= 0 || listScript.Count == 1 )
113 {
114 return SingleExecuteScalar(conn, tran, cmdText, cmdAction);
115 }
116 else
117 {
118 OracleBatchResult< object > result = ExecuteBatchScript< object >(conn, tran, listScript, false , cmdAction, null );
119 return result.ExecuteScalar();
120 }
121 }
122 public static DataSet ExecuteFillDataSet(OracleConnection conn, OracleTransaction tran, string cmdText, Action<OracleCommand> cmdAction)
123 {
124 List<OracleSingleScript> listScript = SplitOracleScript(cmdText);
125 if (listScript == null || listScript.Count <= 0 || listScript.Count == 1 )
126 {
127 DataTable dataTable = SingleExecuteFillDataTable(conn, tran, cmdText, cmdAction);
128 DataSet dataSet = new DataSet();
129 if (dataTable != null ) dataSet.Tables.Add(dataTable);
130 return dataSet;
131 }
132 else
133 {
134 OracleBatchResult< object > result = ExecuteBatchScript< object >(conn, tran, listScript, true , cmdAction, null );
135 return result.ExecuteFillDataSet();
136 }
137 }
138
139
140
141 private static OracleBatchResult<T> ExecuteBatchScript<T>( string connString, IEnumerable<OracleSingleScript> listScript, bool isSelectDataSet, Action<OracleCommand> cmdAction, Func<OracleDataReader, T> funcReader) where T : new ()
142 {
143 using (OracleConnection conn = new OracleConnection(connString))
144 {
145 TryOpenSqlConnection(conn);
146 using (OracleTransaction tran = conn.BeginTransaction())
147 {
148 OracleBatchResult<T> result = ExecuteBatchScript(conn, tran, listScript, isSelectDataSet, cmdAction, funcReader);
149 return result;
150 }
151 }
152 }
153 private static OracleBatchResult<T> ExecuteBatchScript<T>(OracleConnection conn, OracleTransaction tran, IEnumerable<OracleSingleScript> listScript, bool isSelectDataSet, Action<OracleCommand> cmdAction, Func<OracleDataReader, T> funcReader) where T : new ()
154 {
155 OracleBatchResult<T> result = new OracleBatchResult<T> ();
156
157 bool tranIsNull = tran == null ;
158 if (tranIsNull) tran = conn.BeginTransaction();
159 try
160 {
161 foreach (OracleSingleScript script in listScript)
162 {
163 #region 执行查询实体
164
165 if (script.IsSelect)
166 {
167 if (isSelectDataSet)
168 {
169 DataTable dataTable = SingleExecuteFillDataTable(conn, tran, script.SqlScript, cmdAction);
170 result.AddDataTable(dataTable);
171 }
172 else if ( typeof (T) == typeof ( object ) && funcReader == null )
173 {
174 object scalar = SingleExecuteScalar(conn, tran, script.SqlScript, cmdAction);
175 result.AddScalar(scalar);
176 }
177 else
178 {
179 List<T> list = SingleExecuteReaderList<T> (conn, tran, script.SqlScript, cmdAction, funcReader);
180 result.AddList(list);
181 }
182 }
183
184 #endregion
185 #region 执行增加修改删除
186
187 if (script.IsInsert || script.IsUpdate || script.IsDelete)
188 {
189 int effect = SingleExecuteNonQuery(conn, tran, script.SqlScript, cmdAction);
190 result.AddEffect(effect);
191 }
192
193 #endregion
194 }
195 if (tranIsNull && tran != null ) tran.Commit();
196 }
197 finally
198 {
199 if (tranIsNull && tran != null ) tran.Dispose();
200 }
201
202 return result;
203 }
204
205
206 #region 执行单条脚本
207
208 // private static List<T> SingleExecuteReaderList<T>(string connString, string cmdText, Action<OracleCommand> cmdAction, Func<OracleDataReader, T> funcReader) where T : new()
209 // {
210 // using (OracleConnection conn = new OracleConnection(connString))
211 // {
212 // TryOpenSqlConnection(conn);
213 // return SingleExecuteReaderList(conn, null, cmdText, cmdAction, funcReader);
214 // }
215 // }
216 // private static T SingleExecuteReaderEntity<T>(string connString, string cmdText, Action<OracleCommand> cmdAction, Func<OracleDataReader, T> funcReader) where T : new()
217 // {
218 // using (OracleConnection conn = new OracleConnection(connString))
219 // {
220 // TryOpenSqlConnection(conn);
221 // return SingleExecuteReaderEntity(conn, null, cmdText, cmdAction, funcReader);
222 // }
223 // }
224 // private static int SingleExecuteNonQuery(string connString, string cmdText, Action<OracleCommand> cmdAction)
225 // {
226 // using (OracleConnection conn = new OracleConnection(connString))
227 // {
228 // TryOpenSqlConnection(conn);
229 // return SingleExecuteNonQuery(conn, null, cmdText, cmdAction);
230 // }
231 // }
232 // private static object SingleExecuteScalar(string connString, string cmdText, Action<OracleCommand> cmdAction)
233 // {
234 // using (OracleConnection conn = new OracleConnection(connString))
235 // {
236 // TryOpenSqlConnection(conn);
237 // return SingleExecuteScalar(conn, null, cmdText, cmdAction);
238 // }
239 // }
240 // private static DataTable SingleExecuteFillDataTable(string connString, string cmdText, Action<OracleCommand> cmdAction)
241 // {
242 // using (OracleConnection conn = new OracleConnection(connString))
243 // {
244 // TryOpenSqlConnection(conn);
245 // return SingleExecuteFillDataTable(conn, null, cmdText, cmdAction);
246 // }
247 // }
248
249
250 private static List<T> SingleExecuteReaderList<T>(OracleConnection conn, OracleTransaction tran, string cmdText, Action<OracleCommand> cmdAction, Func<OracleDataReader, T> funcReader) where T : new ()
251 {
252 List<T> list = new List<T> ();
253 // 需要查询的是否是 原生值类型
254 bool isMetaValue = typeof (T).IsValueType && typeof (T).GetProperties().Length <= 0 && typeof (T).GetFields().Length <= 0 ;
255
256 using (OracleCommand cmd = conn.CreateCommand())
257 {
258 cmd.CommandText = cmdText;
259 cmd.CommandTimeout = int .MaxValue;
260 // cmd.Transaction = tran;
261 if (cmdAction != null ) cmdAction(cmd);
262
263 using (OracleDataReader reader = cmd.ExecuteReader())
264 {
265 List<查看更多关于『片段』OracleHelper (支持 多条SQL语句)的详细内容...
声明:本文来自网络,不代表【好得很程序员自学网】立场,转载请注明出处:http://www.haodehen.cn/did118612