大量数据导入操作, 也就是直接将DataTable里的内容写入到数据库
通用方法: 拼接Insert语句, 好土鳖
1. MS Sql Server: 使用SqlBulkCopy
2. MySql:
adapter.update()批量更新
MySqlBulkLoader, 这个是从文件里边到的, 有个实现是先将DATATable编程CSV文件, 在用MySqlBulkLoader导入MySql
原文引用于Rocho.J的批量插入数据, 将DataTable里的数据批量写入数据库的方法
//参考代码

1 Function to create .csv file from DataTable (you can skip this, if you already have csv file) 2 public static void CreateCSVfile(DataTable dtable, string strFilePath) 3 { 4 StreamWriter sw = new StreamWriter(strFilePath, false); 5 int icolcount = dtable.Columns.Count; 6 foreach (DataRow drow in dtable.Rows) 7 { 8 for (int i = 0; i < icolcount; i++) 9 { 10 if (!Convert.IsDBNull(drow[i])) 11 { 12 sw.Write(drow[i].ToString()); 13 } 14 if (i < icolcount - 1) 15 { 16 sw.Write(","); 17 } 18 } 19 sw.Write(sw.NewLine); 20 } 21 sw.Close(); 22 sw.Dispose(); 23 } 24 25 //2. Import data into MySQL database 26 private void ImportMySQL() 27 { 28 DataTable orderDetail = new DataTable("ItemDetail"); 29 DataColumn c = new DataColumn(); // always 30 orderDetail.Columns.Add(new DataColumn("ID", Type.GetType("System.Int32"))); 31 orderDetail.Columns.Add(new DataColumn("value", Type.GetType("System.Int32"))); 32 orderDetail.Columns.Add(new DataColumn("length", Type.GetType("System.Int32"))); 33 orderDetail.Columns.Add(new DataColumn("breadth", Type.GetType("System.Int32"))); 34 orderDetail.Columns.Add(new DataColumn("total", Type.GetType("System.Decimal"))); 35 orderDetail.Columns["total"].Expression = "value/(length*breadth)"; //Adding dummy entries 36 DataRow dr = orderDetail.NewRow(); 37 dr["ID"] = 1; 38 dr["value"] = 50; 39 dr["length"] = 5; 40 dr["breadth"] = 8; 41 orderDetail.Rows.Add(dr); 42 dr = orderDetail.NewRow(); 43 dr["ID"] = 2; 44 dr["value"] = 60; 45 dr["length"] = 15; 46 dr["breadth"] = 18; 47 orderDetail.Rows.Add(dr); //Adding dummy entries 48 string connectMySQL = "Server=localhost;Database=test;Uid=username;Pwd=password;"; 49 string strFile = "/TempFolder/MySQL" + DateTime.Now.Ticks.ToString() + ".csv"; //Create directory if not exist... Make sure directory has required rights.. 50 if (!Directory.Exists(Server.MapPath("~/TempFolder/"))) 51 Directory.CreateDirectory(Server.MapPath("~/TempFolder/")); //If file does not exist then create it and right data into it.. 52 if (!File.Exists(Server.MapPath(strFile))) 53 { 54 FileStream fs = new FileStream(Server.MapPath(strFile), FileMode.Create, FileAccess.Write); 55 fs.Close(); 56 fs.Dispose(); 57 } 58 //Generate csv file from where data read 59 CreateCSVfile(orderDetail, Server.MapPath(strFile)); 60 using (MySqlConnection cn1 = new MySqlConnection(connectMySQL)) 61 { 62 cn1.Open(); 63 MySqlBulkLoader bcp1 = new MySqlBulkLoader(cn1); 64 bcp1.TableName = "productorder"; //Create ProductOrder table into MYSQL database... 65 bcp1.FieldTerminator = ","; 66 bcp1.LineTerminator = "\r\n"; 67 bcp1.FileName = Server.MapPath(strFile); 68 bcp1.NumberOfLinesToSkip = 0; 69 bcp1.Load(); //Once data write into db then delete file.. 70 try 71 { 72 File.Delete(Server.MapPath(strFile)); 73 } 74 catch (Exception ex) 75 { 76 string str = ex.Message; 77 } 78 } 79 }
3. MS Access: 只能用批量更新了, adapter.update()
备注: 此处先标记个思路, 等我这实现完了, 贴个示例
==============
其实早就做完了, 都忘记这回事了... 今天看到这篇, 补一下代码
//枚举

1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 6 namespace ETLUtilityDAL.Enums 7 { 8 public enum DatabaseType 9 { 10 MSSql, 11 MySql, 12 MSAccess, 13 Oracle 14 } 15 }
//公共方法
//DALFactory.cs

1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 6 using System.Configuration; 7 using ETLUtilityDAL.Enums; 8 using ETLUtilityDAL.Interfaces; 9 using ETLUtilityDAL.Implement; 10 using System.Data.SqlClient; 11 12 namespace ETLUtilityDAL.Common 13 { 14 /// <summary> 15 /// 数据库访问工厂, 用于产生相应类型的数据库实例 16 /// </summary> 17 public class DALFactory 18 { 19 private static readonly Dictionary<string, string> dictConnectionStrs = new Dictionary<string, string>(); 20 private static readonly DatabaseType currentDB = (DatabaseType)Enum.Parse(typeof(DatabaseType), ConfigurationManager.AppSettings["CurrentDatabase"]); 21 22 /// <summary> 23 /// 静态构造函数, 用于初始化数据库连接串字典 24 /// </summary> 25 static DALFactory() 26 { 27 getConnectionDictionary(); 28 } 29 30 private static void getConnectionDictionary() 31 { 32 ConnectionStringSettingsCollection cssc = ConfigurationManager.ConnectionStrings; 33 string tempConStr = ""; 34 foreach (string str in Enum.GetNames(typeof(DatabaseType))) 35 try 36 { 37 tempConStr = cssc[str.Trim().ToLower()].ConnectionString; 38 if (!string.IsNullOrEmpty(tempConStr)) 39 dictConnectionStrs.Add(str, tempConStr); 40 } 41 catch (Exception ex) 42 { 43 //throw ex; 44 } 45 } 46 47 /// <summary> 48 /// 返回连接串字典以供查看 49 /// </summary> 50 public static Dictionary<string,string> ConnectionStringsDictionary 51 { 52 get { return dictConnectionStrs; } 53 } 54 55 /// <summary> 56 /// 根据数据库的类型获得有固定数据库名称的泛型类型的数据库连接对象 57 /// </summary> 58 /// <typeparam name="T">T类型, 表示泛型类型的数据库连接对象</typeparam> 59 /// <param name="dbType">System.Enum类型, 表示数据库的类型</param> 60 /// <returns>T类型, 返回泛型类型的数据库连接对象</returns> 61 public static T GetDatabaseConnection<T>(DatabaseType dbType) 62 { 63 string dbTypeStr = Enum.GetName(typeof(DatabaseType), dbType); 64 if(dictConnectionStrs.Keys.Contains(dbTypeStr)) 65 return (T)Convert.ChangeType(Activator.CreateInstance(typeof(T), dictConnectionStrs[dbTypeStr]),typeof(T)); 66 else 67 return default(T); 68 } 69 70 /// <summary> 71 /// 根据数据库的类型获得指定数据库名称的泛型类型的数据库连接对象 72 /// </summary> 73 /// <typeparam name="T">T类型, 表示泛型类型的数据库连接对象</typeparam> 74 /// <param name="dbType">System.Enum类型, 表示数据库的类型</param> 75 /// <param name="dbName">System.String, 表示指定的数据库名称</param> 76 /// <returns>T类型, 返回泛型类型的数据库连接对象</returns> 77 public static T GetDatabaseConnection<T>(DatabaseType dbType, string dbName) 78 { 79 string dbTypeStr = Enum.GetName(typeof(DatabaseType), dbType); 80 if (dictConnectionStrs.Keys.Contains(dbTypeStr) && !string.IsNullOrEmpty(dbName)) 81 return (T)Convert.ChangeType(Activator.CreateInstance(typeof(T), dictConnectionStrs[dbTypeStr].Replace("*",dbName)), typeof(T)); 82 else 83 return default(T); 84 } 85 86 /// <summary> 87 /// 根据数据库的类型获得固定数据库名称的数据库访问工具类DBHelper 88 /// </summary> 89 /// <param name="dbType">System.Enum类型, 表示数据库的类型</param> 90 /// <returns>Interface, 根据不同的数据库类型返回不同的工具类的实现</returns> 91 public static IDBHelper GetDBHelper(DatabaseType dbType) 92 { 93 #region 94 switch (dbType) 95 { 96 case DatabaseType.MSSql: 97 return new MSSqlDBHelper(); 98 case DatabaseType.MSAccess: 99 return new MSAccessDBHelper(); 100 case DatabaseType.MySql: 101 return new MySqlDBHelper(); 102 case DatabaseType.Oracle: 103 goto default; 104 default: 105 return null; 106 } 107 #endregion 108 } 109 110 /// <summary> 111 /// 根据数据库的类型获得指定数据库名称的数据库访问工具类DBHelper 112 /// </summary> 113 /// <param name="dbType">System.Enum类型, 表示数据库的类型</param> 114 /// <param name="dbName">System.String, 表示指定的数据库名称</param> 115 /// <returns>Interface, 根据不同的数据库名称和类型返回不同的工具类的实现</returns> 116 public static IDBHelper GetDBHelper(DatabaseType dbType, string dbName) 117 { 118 #region 119 switch (dbType) 120 { 121 case DatabaseType.MSSql: 122 return new MSSqlDBHelper(dbName); 123 case DatabaseType.MSAccess: 124 return new MSAccessDBHelper(dbName); 125 case DatabaseType.MySql: 126 return new MySqlDBHelper(dbName); 127 case DatabaseType.Oracle: 128 goto default; 129 default: 130 return null; 131 } 132 #endregion 133 } 134 135 /// <summary> 136 /// 获得当前正在使用的固定数据库名称的数据库类型的访问工具类Helper 137 /// </summary> 138 /// <returns>Interface, 根据不同的数据库类型返回不同的工具类的实现</returns> 139 public static IDBHelper GetDBHelper() 140 { 141 return GetDBHelper(currentDB); 142 } 143 144 /// <summary> 145 /// 获得当前正在使用的指定据库名称的数据库类型的访问工具类Helper 146 /// </summary> 147 /// <returns>Interface, 根据不同的数据库名称和类型返回不同的工具类的实现</returns> 148 public static IDBHelper GetDBHelper(string dbName) 149 { 150 return GetDBHelper(currentDB,dbName); 151 } 152 } 153 }
//FileHelper.cs

1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 6 using System.IO; 7 using System.Data; 8 9 namespace ETLUtilityDAL.Common 10 { 11 public class FileHelper 12 { 13 public static string ReadFileToString(string fileFullPath, Encoding codeType) 14 { 15 string result = ""; 16 if (string.IsNullOrEmpty(fileFullPath)) 17 throw new ArgumentNullException( "fileFullPath","File path can not be null or empty! "); 18 using (FileStream fileStream = new FileStream(fileFullPath, FileMode.OpenOrCreate, FileAccess.Read)) 19 { 20 if (!File.Exists(fileFullPath)) 21 throw new FileNotFoundException("File not found! "); 22 } 23 24 using (StreamReader sReader = new StreamReader(fileFullPath, codeType)) 25 { 26 try 27 { 28 result = sReader.ReadToEnd(); 29 } 30 catch (Exception ex) 31 { 32 throw new IOException(ex.Message); 33 } 34 } 35 return result; 36 } 37 38 public static string ReadFileToString(string fileFullPath) 39 { 40 return ReadFileToString(fileFullPath, Encoding.Default); 41 } 42 43 public static void WriteDataTableToCSVFile(DataTable dataTable, string fileFullPath, Encoding codeType) 44 { 45 using (Stream stream = new FileStream(fileFullPath,FileMode.Create,FileAccess.Write)) 46 using (StreamWriter swriter = new StreamWriter(stream, codeType)) 47 { 48 try 49 { 50 int icolcount = dataTable.Columns.Count; 51 foreach (DataRow drow in dataTable.Rows) 52 { 53 for (int i = 0; i < icolcount; i++) 54 { 55 if (!Convert.IsDBNull(drow[i])) 56 { 57 swriter.Write(drow[i].ToString()); 58 } 59 if (i < icolcount - 1) 60 { 61 swriter.Write("|"); 62 } 63 } 64 swriter.Write(swriter.NewLine); 65 } 66 } 67 catch (Exception ex) 68 { 69 throw new IOException(ex.Message); 70 } 71 } 72 } 73 74 public static void WriteDataTableToCSVFile(DataTable dataTable, string fileFullPath) 75 { 76 WriteDataTableToCSVFile(dataTable, fileFullPath, Encoding.Default); 77 } 78 79 public static string[] GetFileFullPathList(string directoryPath, string fileType, bool IsRecursive) 80 { 81 return IsRecursive ? Directory.GetFiles(directoryPath, fileType, SearchOption.AllDirectories) : Directory.GetFiles(directoryPath, fileType, SearchOption.TopDirectoryOnly); 82 } 83 84 public static string[] GetSubDirectorys(string directoryPath, string containsName, bool IsRecursive) 85 { 86 return IsRecursive ? Directory.GetDirectories(directoryPath, containsName, SearchOption.AllDirectories) : Directory.GetDirectories(directoryPath, containsName, SearchOption.TopDirectoryOnly); 87 } 88 89 public static void WriteStringToFile(string fileFullPath, bool isAppend ,string fileContent) 90 { 91 WriteStringToFile(fileFullPath, isAppend, fileContent, Encoding.Default); 92 } 93 94 public static void WriteStringToFile(string fileFullPath, bool isAppend, string fileContent, Encoding codeType) 95 { 96 //using (FileStream fileStream = new FileStream(fileFullPath, FileMode.OpenOrCreate, FileAccess.Write)) 97 using (StreamWriter sWriter = new StreamWriter(fileFullPath,isAppend,codeType)) 98 { 99 try 100 { 101 if (!File.Exists(fileFullPath)) 102 File.Create(fileFullPath); 103 sWriter.Write(fileContent); 104 } 105 catch (Exception ex) 106 { 107 throw new IOException(ex.Message); 108 } 109 } 110 } 111 } 112 }
//XMLHelper.cs, 用List模拟堆栈实现XML结点的操作

1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 6 using System.IO; 7 using System.Xml; 8 using System.Xml.XPath; 9 using System.Xml.Schema; 10 using ETLUtilityDAL.Enums; 11 using System.Collections.Specialized; 12 using ETLUtilityModel; 13 using ETLUtilityModel.Enums; 14 15 namespace ETLUtilityDAL.Common 16 { 17 public class XMLHelper 18 { 19 #region XMLStream 20 public static List<ETLXmlNode> GetAllNodesFromXMLFile(string xmlFileFullName) 21 { 22 List<ETLXmlNode> xmlNodeLst = new List<ETLXmlNode>(); 23 24 using (Stream stream = new FileStream(xmlFileFullName, FileMode.Open, FileAccess.Read)) 25 using (XmlTextReader xmlTxtReader = new XmlTextReader(stream)) 26 { 27 int fathId = 0; //root node: 0 28 int elemCount = 1; //Element Count 29 XmlNodeType nodeType; 30 ETLXmlNode xNode; 31 ETLXmlNodeStack nodStack = ETLXmlNodeStack.CreateETLXmlNodeStack(); 32 while (xmlTxtReader.Read()) 33 { 34 xNode = null; 35 nodeType = xmlTxtReader.NodeType; 36 switch (nodeType) 37 { 38 case XmlNodeType.Element: 39 bool isEmpty = false; 40 if (isEmpty = xmlTxtReader.IsEmptyElement) 41 xNode = new ETLXmlNode(elemCount, xmlTxtReader.Name, ETLXmlNodeType.OddNode, fathId); 42 else 43 xNode = new ETLXmlNode(elemCount, xmlTxtReader.Name, ETLXmlNodeType.EvenNode, fathId); 44 45 fathId = elemCount; 46 elemCount++; 47 48 //Deal with the Attribute 49 if (xmlTxtReader.HasAttributes) 50 { 51 NameValueCollection nvc = xNode.NodeAttributes; 52 for (int i = 0; i < xmlTxtReader.AttributeCount; i++) 53 { 54 xmlTxtReader.MoveToAttribute(i); 55 nvc.Add(xmlTxtReader.Name, xmlTxtReader.Value); 56 } 57 } 58 if (isEmpty) 59 { 60 xmlNodeLst.Add(xNode); 61 fathId = xNode.FatherNodeId; 62 } 63 else 64 ETLXmlNodeStack.Push(xNode); 65 break; 66 case XmlNodeType.EndElement: 67 xNode = ETLXmlNodeStack.Pop(); 68 xmlNodeLst.Add(xNode); 69 fathId = xNode.FatherNodeId; 70 break; 71 case XmlNodeType.Text: 72 xNode = ETLXmlNodeStack.Pop(); 73 xNode.NodeText = xmlTxtReader.Value; 74 ETLXmlNodeStack.Push(xNode); 75 break; 76 default: 77 break; 78 } 79 } 80 } 81 82 return xmlNodeLst; 83 } 84 #endregion 85 86 87 #region XPath --- Not Implement 88 #endregion 89 90 #region XPathExpress --- Not Implement 91 92 #endregion 93 94 #region Common 95 public static bool IsValidateXmlFile(string xmlSchemaFileFullName) 96 { 97 bool result = false; 98 using (Stream stream = new FileStream(xmlSchemaFileFullName, FileMode.Open, FileAccess.Read)) 99 using (XmlTextReader xmlTxtReader = new XmlTextReader(stream)) 100 { 101 XmlSchema schema = XmlSchema.Read(stream, new ValidationEventHandler(dealSchemaValidation)); 102 XmlReaderSettings settings = new XmlReaderSettings(); 103 settings.Schemas.Add(schema); 104 settings.ValidationType = ValidationType.Schema; 105 settings.ValidationEventHandler += new ValidationEventHandler(dealSchemaValidation); 106 107 //Execute Validate 108 try 109 { 110 while (xmlTxtReader.Read()) 111 { } 112 result = true; 113 } 114 catch (XmlSchemaValidationException xsve) 115 { 116 result = false; 117 throw xsve; 118 } 119 } 120 return result; 121 } 122 123 private static void dealSchemaValidation(object sender, System.Xml.Schema.ValidationEventArgs e) 124 { 125 throw new XmlSchemaValidationException(string.Format("Validation Error, Error Level:{0}\r\n. Error Details:\r\n{1}", e.Severity, e.Message)); 126 } 127 #endregion 128 129 static void TestMethod() 130 { 131 #region 使用XML流处理, 每次只处理一个节点, 速度快, 但缺点是: 不支持结构化查询, 适合从头到尾一次性处理 132 //使用xml流输出字符 133 using (System.Xml.XmlWriter xmlwriter = System.Xml.XmlWriter.Create("Output.xml")) 134 { 135 xmlwriter.WriteStartDocument(); 136 xmlwriter.WriteStartElement("human"); //</humen> 137 xmlwriter.WriteStartElement("man"); //子元素 138 //写元素属性 139 xmlwriter.WriteAttributeString("name", "father"); //属性 140 xmlwriter.WriteString("Mike"); //文本区 141 xmlwriter.WriteEndElement(); 142 xmlwriter.WriteElementString("women", "jean"); //<women>jean</women> 143 xmlwriter.WriteStartElement("children"); 144 xmlwriter.WriteAttributeString("name", "kiddy"); 145 xmlwriter.WriteString("nickey kiddy"); //文本区 146 xmlwriter.WriteEndElement(); 147 xmlwriter.WriteEndElement(); 148 } 149 #endregion 150 #region 使用优化的XPath--XPathDocument类, 速度快, 也支持结构化的查询方式. 缺点: 只能读不能写 151 //1.创建XPathDocument对象 152 System.Xml.XPath.XPathDocument xpdoc = new System.Xml.XPath.XPathDocument("XMLOperation.xml"); 153 //2.通过导航器进行查找 154 System.Xml.XPath.XPathNavigator xpnav = xpdoc.CreateNavigator(); 155 //3.经过编译的XPath 156 string xpath = "/configuration/system.web/httpHandlers/cellphone"; 157 System.Xml.XPath.XPathExpression xpe = System.Xml.XPath.XPathExpression.Compile(xpath); 158 //4.使用导航器的Select迭代器进行查找, 查找的结果还是导航器 159 System.Xml.XPath.XPathNavigator resultNav = xpnav.SelectSingleNode(xpe); 160 Console.WriteLine("----------XPathDocument的查询单个结果----------"); 161 Console.WriteLine(resultNav.Value); 162 //查找多个结果 163 Console.WriteLine("----------XPathDocument的查询多个结果----------"); 164 xpath = "/configuration/system.web/httpHandlers/add/@type"; //查找add元素的type属性内容 165 xpe = System.Xml.XPath.XPathExpression.Compile(xpath); 166 System.Xml.XPath.XPathNodeIterator xpniter = xpnav.Select(xpe); 167 foreach (System.Xml.XPath.XPathNavigator xpn in xpniter) 168 { 169 Console.WriteLine(xpn.Value); 170 } 171 #endregion 172 } 173 } 174 175 /// <summary> 176 /// 用List模拟堆栈操作, 用于读取XML中的结点 177 /// </summary> 178 public class ETLXmlNodeStack 179 { 180 private List<ETLXmlNode> _xmlStack; 181 182 private ETLXmlNodeStack() 183 { 184 this._xmlStack = new List<ETLXmlNode>(100); 185 } 186 187 private static readonly ETLXmlNodeStack inner; 188 static ETLXmlNodeStack() 189 { 190 inner = new ETLXmlNodeStack(); 191 } 192 193 public static ETLXmlNodeStack ETLXmlNodeStackInfo 194 { 195 get 196 { 197 return inner; 198 } 199 } 200 201 public static int Count 202 { 203 get 204 { 205 return inner._xmlStack.Count; 206 } 207 } 208 209 public static ETLXmlNodeStack CreateETLXmlNodeStack() 210 { 211 return inner; 212 } 213 214 public static void Push(ETLXmlNode etlXmlNode) 215 { 216 inner._xmlStack.Add(etlXmlNode); 217 } 218 219 public static ETLXmlNode Pop() 220 { 221 ETLXmlNode result = null; 222 if (inner._xmlStack != null && inner._xmlStack.Count > 0) 223 { 224 result = inner._xmlStack[inner._xmlStack.Count - 1]; 225 inner._xmlStack.RemoveAt(inner._xmlStack.Count - 1); 226 } 227 return result; 228 } 229 } 230 }
//接口

1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 6 using System.Data; 7 using ETLUtilityDAL.Enums; 8 9 namespace ETLUtilityDAL.Interfaces 10 { 11 /// <summary> 12 /// Utility Of Data Access Layer 13 /// </summary> 14 public interface IDBHelper 15 { 16 #region BaseExecute 17 int ExecNonQuery(string sqlText, CommandType cmdType, string[] paramNames, object[] paramValues); 18 T ExecScalar<T>(string sqlText, CommandType cmdType, string[] paramNames, object[] paramValues); 19 T ExecReader<T>(string sqlText, CommandType cmdType, string[] paramNames, object[] paramValues); 20 DataTable ExecDataTable(string sqlText, CommandType cmdType, string[] paramNames, object[] paramValues); 21 DataSet ExecDataSet(string sqlText, CommandType cmdType, string[] paramNames, object[] paramValues); 22 #endregion 23 24 #region TxtExecute 25 int TxtExecuteNonQuery(string sqlText); 26 int TxtExecuteNonQuery(string sqlText, string[] paramNames, object[] paramValues); 27 T TxtExecuteScalar<T>(string sqlText, string[] paramNames, object[] paramValues); 28 T TxtExecuteReader<T>(string sqlText, string[] paramNames, object[] paramValues); 29 DataTable TxtExecuteDataTable(string sqlText, string[] paramNames, object[] paramValues); 30 DataSet TxtExecuteDataSet(string sqlText, string[] paramNames, object[] paramValues); 31 #endregion 32 33 #region SpExecute 34 int SpExecuteNonQuery(string sqlText); 35 int SpExecuteNonQuery(string spName, string[] paramNames, object[] paramValues); 36 T SpExecuteScalar<T>(string spName, string[] paramNames, object[] paramValues); 37 T SpExecuteReader<T>(string spName, string[] paramNames, object[] paramValues); 38 DataTable SpExecuteDataTable(string spName, string[] paramNames, object[] paramValues); 39 DataSet SpExecuteDataSet(string spName, string[] paramNames, object[] paramValues); 40 #endregion 41 42 #region Common 43 bool BulkInsert<T, T1>(T sqlBulkCopy, DataTable dataTable, T1 sqlTrasaction); 44 bool BulkInsert(DataTable dataTable); 45 bool BulkInsert(DataSet dataSet); 46 47 string DBName { get; } 48 T GetConnection<T>(); 49 #endregion 50 } 51 }
//MsAccess实现

1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 6 using ETLUtilityDAL.Interfaces; 7 using ETLUtilityDAL.Enums; 8 using ETLUtilityDAL.Common; 9 using System.Data; 10 using System.Data.OleDb; 11 using System.Data.SqlClient; 12 13 namespace ETLUtilityDAL.Implement 14 { 15 public class MSAccessDBHelper : IDBHelper 16 { 17 private DatabaseType _dBVender = DatabaseType.MSAccess; 18 private string _dbName; 19 20 public MSAccessDBHelper() 21 { 22 this._dbName = ""; 23 } 24 25 public MSAccessDBHelper(string dbName) 26 { 27 this._dbName = dbName; 28 } 29 30 #region IDBHelper 成员 31 32 public int ExecNonQuery(string sqlText, CommandType cmdType, string[] paramNames, object[] paramValues) 33 { 34 int result = 0; 35 using (OleDbConnection oleDbCon = GetConnection<OleDbConnection>()) 36 { 37 OleDbCommand oleDbCmd = new OleDbCommand(sqlText, oleDbCon); 38 oleDbCmd.CommandType = cmdType; 39 try 40 { 41 fillParameters(oleDbCmd, paramNames, paramValues); 42 oleDbCon.Open(); 43 result = oleDbCmd.ExecuteNonQuery(); 44 } 45 catch (OleDbException ode) 46 { 47 throw ode; 48 } 49 } 50 return 0; 51 } 52 53 public T ExecScalar<T>(string sqlText, CommandType cmdType, string[] paramNames, object[] paramValues) 54 { 55 T result = default(T); 56 using (OleDbConnection oleDbCon = GetConnection<OleDbConnection>()) 57 { 58 OleDbCommand oleDbCmd = new OleDbCommand(sqlText, oleDbCon); 59 oleDbCmd.CommandType = cmdType; 60 try 61 { 62 fillParameters(oleDbCmd, paramNames, paramValues); 63 oleDbCon.Open(); 64 result = (T)Convert.ChangeType(oleDbCmd.ExecuteScalar(), typeof(T)); 65 } 66 catch (OleDbException ode) 67 { 68 throw ode; 69 } 70 } 71 return result; 72 } 73 74 public T ExecReader<T>(string sqlText, CommandType cmdType, string[] paramNames, object[] paramValues) 75 { 76 T result = default(T); 77 using (OleDbConnection oleDbCon = GetConnection<OleDbConnection>()) 78 { 79 OleDbCommand oleDbCmd = new OleDbCommand(sqlText, oleDbCon); 80 oleDbCmd.CommandType = cmdType; 81 try 82 { 83 fillParameters(oleDbCmd, paramNames, paramValues); 84 oleDbCon.Open(); 85 result = (T)Convert.ChangeType(oleDbCmd.ExecuteReader(CommandBehavior.CloseConnection), typeof(T)); 86 } 87 catch (OleDbException ode) 88 { 89 throw ode; 90 } 91 } 92 return result; 93 } 94 95 public DataTable ExecDataTable(string sqlText, CommandType cmdType, string[] paramNames, object[] paramValues) 96 { 97 DataTable result = new DataTable(); 98 using (OleDbConnection oleDbCon = GetConnection<OleDbConnection>()) 99 { 100 OleDbCommand oleDbCmd = new OleDbCommand(sqlText, oleDbCon); 101 oleDbCmd.CommandType = cmdType; 102 try 103 { 104 fillParameters(oleDbCmd, paramNames, paramValues); 105 OleDbDataAdapter oledDbDA = new OleDbDataAdapter(oleDbCmd); 106 oledDbDA.Fill(result); 107 } 108 catch (OleDbException ode) 109 { 110 throw ode; 111 } 112 } 113 return result; 114 } 115 116 public DataSet ExecDataSet(string sqlText, CommandType cmdType, string[] paramNames, object[] paramValues) 117 { 118 DataSet result = new DataSet(); 119 using (OleDbConnection oleDbCon = GetConnection<OleDbConnection>()) 120 { 121 OleDbCommand oleDbCmd = new OleDbCommand(sqlText, oleDbCon); 122 oleDbCmd.CommandType = cmdType; 123 try 124 { 125 fillParameters(oleDbCmd, paramNames, paramValues); 126 OleDbDataAdapter oledDbDA = new OleDbDataAdapter(oleDbCmd); 127 oledDbDA.Fill(result); 128 } 129 catch (OleDbException se) 130 { 131 throw se; 132 } 133 } 134 return result; 135 } 136 137 public int TxtExecuteNonQuery(string sqlText) 138 { 139 return ExecNonQuery(sqlText, CommandType.Text, null, null); 140 } 141 142 public int TxtExecuteNonQuery(string sqlText, string[] paramNames, object[] paramValues) 143 { 144 return ExecNonQuery(sqlText, CommandType.Text, paramNames, paramValues); 145 } 146 147 public T TxtExecuteScalar<T>(string sqlText,string[] paramNames, object[] paramValues) 148 { 149 return ExecScalar<T>(sqlText, CommandType.Text, paramNames, paramValues); 150 } 151 152 public T TxtExecuteReader<T>(string sqlText, string[] paramNames, object[] paramValues) 153 { 154 return ExecReader<T>(sqlText, CommandType.Text, paramNames, paramValues); 155 } 156 157 public DataTable TxtExecuteDataTable(string sqlText, string[] paramNames, object[] paramValues) 158 { 159 return ExecDataTable(sqlText, CommandType.Text, paramNames, paramValues); 160 } 161 162 public DataSet TxtExecuteDataSet(string sqlText, string[] paramNames, object[] paramValues) 163 { 164 return ExecDataSet(sqlText, CommandType.Text, paramNames, paramValues); 165 } 166 167 public int SpExecuteNonQuery(string sqlText) 168 { 169 return ExecNonQuery("USP_RunSql", CommandType.StoredProcedure, null, null); 170 } 171 172 public int SpExecuteNonQuery(string spName, string[] paramNames, object[] paramValues) 173 { 174 return ExecNonQuery(spName, CommandType.StoredProcedure, paramNames, paramValues); 175 } 176 177 public T SpExecuteScalar<T>(string spName, string[] paramNames, object[] paramValues) 178 { 179 return ExecScalar<T>(spName, CommandType.StoredProcedure, paramNames, paramValues); 180 } 181 182 public T SpExecuteReader<T>(string spName, string[] paramNames, object[] paramValues) 183 { 184 return ExecReader<T>(spName, CommandType.StoredProcedure, paramNames, paramValues); 185 } 186 187 public DataTable SpExecuteDataTable(string spName, string[] paramNames, object[] paramValues) 188 { 189 return ExecDataTable(spName, CommandType.StoredProcedure, paramNames, paramValues); 190 } 191 192 public DataSet SpExecuteDataSet(string spName, string[] paramNames, object[] paramValues) 193 { 194 return ExecDataSet(spName, CommandType.StoredProcedure, paramNames, paramValues); 195 } 196 #endregion 197 198 private void fillParameters(OleDbCommand oleDbCmd, string[] paramNames, object[] paramValues) 199 { 200 if (paramNames == null && paramNames.Length == 0) 201 return; 202 if (paramValues == null && paramValues.Length == 0) 203 return; 204 205 if (paramNames.Length != paramValues.Length) 206 throw new ArgumentException("The Name Count of parameters does not match its Value Count! "); 207 208 string name; 209 object value; 210 for (int i = 0; i < paramNames.Length; i++) 211 { 212 name = paramNames[i]; 213 value = paramValues[i]; 214 if (value != null) 215 oleDbCmd.Parameters.AddWithValue(name, value); 216 else 217 oleDbCmd.Parameters.AddWithValue(name, DBNull.Value); 218 } 219 } 220 221 #region IDBHelper Members 222 223 public bool BulkInsert<T, T1>(T sqlBulkCopy, DataTable dataTable, T1 sqlTrasaction) 224 { 225 bool result = false; 226 OleDbTransaction sqlTran = (OleDbTransaction)Convert.ChangeType(sqlTrasaction, typeof(OleDbTransaction)); 227 using (OleDbConnection oleDbCon = GetConnection<OleDbConnection>()) 228 { 229 OleDbCommand oleDbCmd = new OleDbCommand(string.Format("select * from {0}", dataTable.TableName), oleDbCon); 230 oleDbCmd.CommandType = CommandType.Text; 231 try 232 { 233 OleDbDataAdapter oledDbDA = new OleDbDataAdapter(oleDbCmd); 234 OleDbCommandBuilder oledCmdBuilder = new OleDbCommandBuilder(oledDbDA); 235 oledDbDA.Update(dataTable); 236 result = true; 237 } 238 catch (OleDbException ode) 239 { 240 result = false; 241 throw ode; 242 } 243 } 244 return result; 245 } 246 247 public bool BulkInsert(DataTable dataTable) 248 { 249 bool result = false; 250 if (dataTable != null && dataTable.Rows.Count > 0) 251 { 252 using (OleDbConnection oleDbCon = GetConnection<OleDbConnection>()) 253 { 254 oleDbCon.Open(); 255 OleDbTransaction sqlTran = oleDbCon.BeginTransaction(IsolationLevel.ReadCommitted); 256 object obj = null; 257 result = BulkInsert(obj, dataTable, sqlTran); 258 } 259 } 260 return result; 261 } 262 263 public bool BulkInsert(DataSet dataSet) 264 { 265 bool result = false; 266 if (dataSet != null && dataSet.Tables.Count > 0) 267 { 268 using (OleDbConnection oleDbCon = GetConnection<OleDbConnection>()) 269 { 270 oleDbCon.Open(); 271 OleDbTransaction sqlTran = oleDbCon.BeginTransaction(IsolationLevel.ReadCommitted); 272 object obj = null; 273 if (dataSet.Tables.Count == 1) 274 result = BulkInsert(obj, dataSet.Tables[0], sqlTran); 275 else 276 { 277 foreach (DataTable dt in dataSet.Tables) 278 { 279 result = BulkInsert(obj, dt, sqlTran); 280 if (!result) 281 break; 282 } 283 } 284 } 285 } 286 return result; 287 } 288 289 public string DBName 290 { 291 get { return this._dbName; } 292 } 293 294 295 public T GetConnection<T>() 296 { 297 T result = default(T); 298 if (string.IsNullOrEmpty(this._dbName)) 299 result = DALFactory.GetDatabaseConnection<T>(this._dBVender); 300 else 301 result = DALFactory.GetDatabaseConnection<T>(this._dBVender, this._dbName); 302 return result; 303 } 304 305 #endregion 306 } 307 }
//MsSqlServer实现

1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 6 using ETLUtilityDAL.Interfaces; 7 using ETLUtilityDAL.Enums; 8 using ETLUtilityDAL.Common; 9 using ETLUtilityModel.Common; 10 using System.Data; 11 using System.Data.SqlClient; 12 13 14 namespace ETLUtilityDAL.Implement 15 { 16 public class MSSqlDBHelper : IDBHelper 17 { 18 private DatabaseType _dBVender = DatabaseType.MSSql; 19 private string _dbName; 20 21 public MSSqlDBHelper() 22 { 23 this._dbName = ""; 24 } 25 26 public MSSqlDBHelper(string dbName) 27 { 28 this._dbName = dbName; 29 } 30 31 #region IDBHelper 成员 32 33 public int ExecNonQuery(string sqlText, CommandType cmdType, string[] paramNames, object[] paramValues) 34 { 35 int result = 0; 36 using (SqlConnection sqlCon = GetConnection<SqlConnection>()) 37 { 38 SqlCommand sqlCmd = new SqlCommand(sqlText, sqlCon); 39 sqlCmd.CommandType = cmdType; 40 try 41 { 42 fillParameters(sqlCmd, paramNames, paramValues); 43 sqlCon.Open(); 44 result = sqlCmd.ExecuteNonQuery(); 45 } 46 catch (SqlException se) 47 { 48 throw se; 49 } 50 } 51 return result; 52 } 53 54 public T ExecScalar<T>(string sqlText, CommandType cmdType, string[] paramNames, object[] paramValues) 55 { 56 T result = default(T); 57 using (SqlConnection sqlCon = GetConnection<SqlConnection>()) 58 { 59 SqlCommand sqlCmd = new SqlCommand(sqlText, sqlCon); 60 sqlCmd.CommandType = cmdType; 61 try 62 { 63 fillParameters(sqlCmd, paramNames, paramValues); 64 sqlCon.Open(); 65 result = (T)Convert.ChangeType(sqlCmd.ExecuteScalar(),typeof(T)); 66 } 67 catch (SqlException se) 68 { 69 throw se; 70 } 71 } 72 return result; 73 } 74 75 public T ExecReader<T>(string sqlText, CommandType cmdType, string[] paramNames, object[] paramValues) 76 { 77 T result = default(T); 78 using (SqlConnection sqlCon = GetConnection<SqlConnection>()) 79 { 80 SqlCommand sqlCmd = new SqlCommand(sqlText, sqlCon); 81 sqlCmd.CommandType = cmdType; 82 try 83 { 84 fillParameters(sqlCmd, paramNames, paramValues); 85 sqlCon.Open(); 86 result = (T)Convert.ChangeType(sqlCmd.ExecuteReader(CommandBehavior.CloseConnection), typeof(T)); 87 } 88 catch (SqlException se) 89 { 90 throw se; 91 } 92 } 93 return result; 94 } 95 96 public DataTable ExecDataTable(string sqlText, CommandType cmdType, string[] paramNames, object[] paramValues) 97 { 98 DataTable result = new DataTable(); 99 using (SqlConnection sqlCon = GetConnection<SqlConnection>()) 100 { 101 SqlCommand sqlCmd = new SqlCommand(sqlText, sqlCon); 102 sqlCmd.CommandType = cmdType; 103 try 104 { 105 fillParameters(sqlCmd, paramNames, paramValues); 106 SqlDataAdapter sqlDA = new SqlDataAdapter(sqlCmd); 107 sqlDA.Fill(result); 108 } 109 catch (SqlException se) 110 { 111 throw se; 112 } 113 } 114 return result; 115 } 116 117 public DataSet ExecDataSet(string sqlText, CommandType cmdType, string[] paramNames, object[] paramValues) 118 { 119 DataSet result = new DataSet(); 120 using (SqlConnection sqlCon = GetConnection<SqlConnection>()) 121 { 122 SqlCommand sqlCmd = new SqlCommand(sqlText, sqlCon); 123 sqlCmd.CommandType = cmdType; 124 try 125 { 126 fillParameters(sqlCmd, paramNames, paramValues); 127 SqlDataAdapter sqlDA = new SqlDataAdapter(sqlCmd); 128 sqlDA.Fill(result); 129 } 130 catch (SqlException se) 131 { 132 throw se; 133 } 134 } 135 return result; 136 } 137 138 public int TxtExecuteNonQuery(string sqlText) 139 { 140 return ExecNonQuery(sqlText, CommandType.Text, null, null); 141 } 142 143 public int TxtExecuteNonQuery(string sqlText, string[] paramNames, object[] paramValues) 144 { 145 return ExecNonQuery(sqlText, CommandType.Text, paramNames, paramValues); 146 } 147 148 public T TxtExecuteScalar<T>(string sqlText, string[] paramNames, object[] paramValues) 149 { 150 return ExecScalar<T>(sqlText, CommandType.Text, paramNames, paramValues); 151 } 152 153 public T TxtExecuteReader<T>(string sqlText, string[] paramNames, object[] paramValues) 154 { 155 return ExecReader<T>(sqlText, CommandType.Text, paramNames, paramValues); 156 } 157 158 public DataTable TxtExecuteDataTable(string sqlText, string[] paramNames, object[] paramValues) 159 { 160 return ExecDataTable(sqlText, CommandType.Text, paramNames, paramValues); 161 } 162 163 public DataSet TxtExecuteDataSet(string sqlText, string[] paramNames, object[] paramValues) 164 { 165 return ExecDataSet(sqlText, CommandType.Text, paramNames, paramValues); 166 } 167 168 public int SpExecuteNonQuery(string sqlText) 169 { 170 return ExecNonQuery("USP_RunSql", CommandType.StoredProcedure, null, null); 171 } 172 173 public int SpExecuteNonQuery(string spName, string[] paramNames, object[] paramValues) 174 { 175 return ExecNonQuery(spName, CommandType.StoredProcedure, paramNames, paramValues); 176 } 177 178 public T SpExecuteScalar<T>(string spName, string[] paramNames, object[] paramValues) 179 { 180 return ExecScalar<T>(spName, CommandType.StoredProcedure, paramNames, paramValues); 181 } 182 183 public T SpExecuteReader<T>(string spName, string[] paramNames, object[] paramValues) 184 { 185 return ExecReader<T>(spName, CommandType.StoredProcedure, paramNames, paramValues); 186 } 187 188 public DataTable SpExecuteDataTable(string spName, string[] paramNames, object[] paramValues) 189 { 190 return ExecDataTable(spName, CommandType.StoredProcedure, paramNames, paramValues); 191 } 192 193 public DataSet SpExecuteDataSet(string spName, string[] paramNames, object[] paramValues) 194 { 195 return ExecDataSet(spName, CommandType.StoredProcedure, paramNames, paramValues); 196 } 197 198 public bool BulkInsert<T, T1>(T sqlBulkCopy, DataTable dataTable, T1 sqlTrasaction) 199 { 200 bool result = false; 201 202 SqlBulkCopy sqlBC = (SqlBulkCopy)Convert.ChangeType(sqlBulkCopy, typeof(SqlBulkCopy)); 203 SqlTransaction sqlTran = (SqlTransaction)Convert.ChangeType(sqlTrasaction, typeof(SqlTransaction)); 204 try 205 { 206 sqlBC.DestinationTableName = dataTable.TableName; 207 208 //Mapping Destination Field of Database Table 209 for (int i = 0; i < dataTable.Columns.Count; i++) 210 { 211 sqlBC.ColumnMappings.Add(dataTable.Columns[i].ColumnName, dataTable.Columns[i].ColumnName); 212 } 213 214 //TestCode 215 //string xx = TestUtility.GetColumnDataTypeOfDataTale(dataTable); 216 217 //Write DataTable 218 sqlBC.WriteToServer(dataTable); 219 220 sqlTran.Commit(); 221 result = true; 222 } 223 catch(SqlException ex) 224 { 225 result = false; 226 sqlTran.Rollback(); 227 throw ex; 228 } 229 finally 230 { 231 //T、T1给默认值为Null, 由系统调用GC 232 sqlBC.Close(); 233 sqlBulkCopy = default(T); 234 sqlTrasaction = default(T1); 235 } 236 return result; 237 } 238 239 public bool BulkInsert(DataTable dataTable) 240 { 241 bool result = false; 242 if (dataTable != null && dataTable.Rows.Count > 0) 243 { 244 using (SqlConnection sqlCon = GetConnection<SqlConnection>()) 245 { 246 sqlCon.Open(); 247 SqlTransaction sqlTran = sqlCon.BeginTransaction(IsolationLevel.ReadCommitted); 248 using (SqlBulkCopy sqlBulkCopy = new SqlBulkCopy(sqlCon, SqlBulkCopyOptions.KeepIdentity, sqlTran)) 249 { 250 sqlBulkCopy.BatchSize = 20000; 251 sqlBulkCopy.BulkCopyTimeout = 60; 252 result = BulkInsert(sqlBulkCopy,dataTable,sqlTran); 253 } 254 } 255 } 256 return result; 257 } 258 259 public bool BulkInsert(DataSet dataSet) 260 { 261 bool result = false; 262 if (dataSet != null && dataSet.Tables.Count > 0) 263 { 264 using (SqlConnection sqlCon = GetConnection<SqlConnection>()) 265 { 266 sqlCon.Open(); 267 SqlTransaction sqlTran = sqlCon.BeginTransaction(IsolationLevel.ReadCommitted); 268 using (SqlBulkCopy sqlBulkCopy = new SqlBulkCopy(sqlCon, SqlBulkCopyOptions.KeepIdentity, sqlTran)) 269 { 270 sqlBulkCopy.BatchSize = 20000; 271 sqlBulkCopy.BulkCopyTimeout = 60; 272 if (dataSet.Tables.Count == 1) 273 result = BulkInsert(sqlBulkCopy, dataSet.Tables[0], sqlTran); 274 else 275 { 276 foreach (DataTable dt in dataSet.Tables) 277 { 278 result = BulkInsert(sqlBulkCopy, dt, sqlTran); 279 if (!result) 280 break; 281 } 282 } 283 } 284 } 285 } 286 return result; 287 } 288 289 290 public string DBName 291 { 292 get { return this._dbName; } 293 } 294 295 296 public T GetConnection<T>() 297 { 298 T result = default(T); 299 if (string.IsNullOrEmpty(this._dbName)) 300 result = DALFactory.GetDatabaseConnection<T>(this._dBVender); 301 else 302 result = DALFactory.GetDatabaseConnection<T>(this._dBVender, this._dbName); 303 return result; 304 } 305 #endregion 306 307 private void fillParameters(SqlCommand cmd, string[] paramNames, object[] paramValues) 308 { 309 if (paramNames == null && paramNames.Length == 0) 310 return; 311 if (paramValues == null && paramValues.Length == 0) 312 return; 313 314 if(paramNames.Length != paramValues.Length) 315 throw new ArgumentException("The Name Count of parameters does not match its Value Count! "); 316 317 string name; 318 object value; 319 for (int i = 0; i < paramNames.Length; i++) 320 { 321 name = paramNames[i]; 322 value = paramValues[i]; 323 if (value != null) 324 cmd.Parameters.AddWithValue(name, value); 325 else 326 cmd.Parameters.AddWithValue(name, DBNull.Value); 327 } 328 } 329 } 330 }
//MySql实现

1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 6 using ETLUtilityDAL.Interfaces; 7 using ETLUtilityDAL.Enums; 8 using ETLUtilityDAL.Common; 9 using MySql.Data.MySqlClient; 10 using System.Data; 11 using System.Collections.Specialized; 12 using System.IO; 13 14 namespace ETLUtilityDAL.Implement 15 { 16 public class MySqlDBHelper : IDBHelper 17 { 18 private DatabaseType _dBVender = DatabaseType.MySql; 19 private readonly string _tmpBasePath = AppDomain.CurrentDomain.BaseDirectory; 20 private readonly string _tmpCSVFilePattern = "Temp\\{0}.csv"; //0表示文件名称 21 private string _dbName; 22 23 public MySqlDBHelper() 24 { 25 this._dbName = ""; 26 } 27 28 public MySqlDBHelper(string dbName) 29 { 30 this._dbName = dbName; 31 } 32 33 #region IDBHelper 成员 34 35 public int ExecNonQuery(string sqlText, CommandType cmdType, string[] paramNames, object[] paramValues) 36 { 37 int result = 0; 38 using (MySqlConnection mySqlCon = GetConnection <MySqlConnection>()) 39 { 40 MySqlCommand mySqlCmd = new MySqlCommand(sqlText, mySqlCon); 41 mySqlCmd.CommandType = cmdType; 42 try 43 { 44 fillParameters(mySqlCmd, paramNames, paramValues); 45 mySqlCon.Open(); 46 result = mySqlCmd.ExecuteNonQuery(); 47 } 48 catch (MySqlException mse) 49 { 50 throw mse; 51 } 52 } 53 return 0; 54 } 55 56 public T ExecScalar<T>(string sqlText, CommandType cmdType, string[] paramNames, object[] paramValues) 57 { 58 T result = default(T); 59 using (MySqlConnection mySqlCon = GetConnection<MySqlConnection>()) 60 { 61 MySqlCommand mySqlCmd = new MySqlCommand(sqlText, mySqlCon); 62 mySqlCmd.CommandType = cmdType; 63 try 64 { 65 fillParameters(mySqlCmd, paramNames, paramValues); 66 mySqlCon.Open(); 67 result = (T)Convert.ChangeType(mySqlCmd.ExecuteScalar(), typeof(T)); 68 } 69 catch (MySqlException mse) 70 { 71 throw mse; 72 } 73 } 74 return result; 75 } 76 77 public T ExecReader<T>(string sqlText, CommandType cmdType, string[] paramNames, object[] paramValues) 78 { 79 T result = default(T); 80 using (MySqlConnection mySqlCon = GetConnection<MySqlConnection>()) 81 { 82 MySqlCommand mySqlCmd = new MySqlCommand(sqlText, mySqlCon); 83 mySqlCmd.CommandType = cmdType; 84 try 85 { 86 fillParameters(mySqlCmd, paramNames, paramValues); 87 mySqlCon.Open(); 88 result = (T)Convert.ChangeType(mySqlCmd.ExecuteReader(CommandBehavior.CloseConnection), typeof(T)); 89 } 90 catch (MySqlException mse) 91 { 92 throw mse; 93 } 94 } 95 return result; 96 } 97 98 public DataTable ExecDataTable(string sqlText, CommandType cmdType, string[] paramNames, object[] paramValues) 99 { 100 DataTable result = new DataTable(); 101 using (MySqlConnection mySqlCon = GetConnection<MySqlConnection>()) 102 { 103 MySqlCommand mySqlCmd = new MySqlCommand(sqlText, mySqlCon); 104 mySqlCmd.CommandType = cmdType; 105 try 106 { 107 fillParameters(mySqlCmd, paramNames, paramValues); 108 MySqlDataAdapter mySqlDA = new MySqlDataAdapter(mySqlCmd); 109 mySqlDA.Fill(result); 110 } 111 catch (MySqlException mse) 112 { 113 throw mse; 114 } 115 } 116 return result; 117 } 118 119 public DataSet ExecDataSet(string sqlText, CommandType cmdType, string[] paramNames, object[] paramValues) 120 { 121 DataSet result = new DataSet(); 122 using (MySqlConnection mySqlCon = GetConnection<MySqlConnection>()) 123 { 124 MySqlCommand sqlCmd = new MySqlCommand(sqlText, mySqlCon); 125 sqlCmd.CommandType = cmdType; 126 try 127 { 128 fillParameters(sqlCmd, paramNames, paramValues); 129 MySqlDataAdapter mySqlDA = new MySqlDataAdapter(sqlCmd); 130 mySqlDA.Fill(result); 131 } 132 catch (MySqlException mse) 133 { 134 throw mse; 135 } 136 } 137 return result; 138 } 139 140 public int TxtExecuteNonQuery(string sqlText) 141 { 142 return ExecNonQuery(sqlText, CommandType.Text, null, null); 143 } 144 145 public int TxtExecuteNonQuery(string sqlText, string[] paramNames, object[] paramValues) 146 { 147 return ExecNonQuery(sqlText, CommandType.Text, paramNames, paramValues); 148 } 149 150 public T TxtExecuteScalar<T>(string sqlText, string[] paramNames, object[] paramValues) 151 { 152 return ExecScalar<T>(sqlText, CommandType.Text, paramNames, paramValues); 153 } 154 155 public T TxtExecuteReader<T>(string sqlText, string[] paramNames, object[] paramValues) 156 { 157 return ExecReader<T>(sqlText, CommandType.Text, paramNames, paramValues); 158 } 159 160 public DataTable TxtExecuteDataTable(string sqlText, string[] paramNames, object[] paramValues) 161 { 162 return ExecDataTable(sqlText, CommandType.Text, paramNames, paramValues); 163 } 164 165 public DataSet TxtExecuteDataSet(string sqlText, string[] paramNames, object[] paramValues) 166 { 167 return ExecDataSet(sqlText, CommandType.Text, paramNames, paramValues); 168 } 169 170 public int SpExecuteNonQuery(string sqlText) 171 { 172 return ExecNonQuery("USP_RunSql", CommandType.StoredProcedure, null, null); 173 } 174 175 public int SpExecuteNonQuery(string spName, string[] paramNames, object[] paramValues) 176 { 177 return ExecNonQuery(spName, CommandType.StoredProcedure, paramNames, paramValues); 178 } 179 180 public T SpExecuteScalar<T>(string spName, string[] paramNames, object[] paramValues) 181 { 182 return ExecScalar<T>(spName, CommandType.StoredProcedure, paramNames, paramValues); 183 } 184 185 public T SpExecuteReader<T>(string spName, string[] paramNames, object[] paramValues) 186 { 187 return ExecReader<T>(spName, CommandType.StoredProcedure, paramNames, paramValues); 188 } 189 190 public DataTable SpExecuteDataTable(string spName, string[] paramNames, object[] paramValues) 191 { 192 return ExecDataTable(spName, CommandType.StoredProcedure, paramNames, paramValues); 193 } 194 195 public DataSet SpExecuteDataSet(string spName, string[] paramNames, object[] paramValues) 196 { 197 return ExecDataSet(spName, CommandType.StoredProcedure, paramNames, paramValues); 198 } 199 200 public bool BulkInsert<T, T1>(T sqlBulkCopy, DataTable dataTable, T1 sqlTrasaction) 201 { 202 bool result = false; 203 string tmpCsvPath = this._tmpBasePath + string.Format(this._tmpCSVFilePattern, DateTime.Now.Ticks.ToString()); 204 string tmpFolder = tmpCsvPath.Remove(tmpCsvPath.LastIndexOf("\\")); 205 206 if (!Directory.Exists(tmpFolder)) 207 Directory.CreateDirectory(tmpFolder); 208 209 FileHelper.WriteDataTableToCSVFile(dataTable, tmpCsvPath); //Write to csv File 210 211 MySqlBulkLoader sqlBC = (MySqlBulkLoader)Convert.ChangeType(sqlBulkCopy, typeof(MySqlBulkLoader)); 212 MySqlTransaction sqlTran = (MySqlTransaction)Convert.ChangeType(sqlTrasaction, typeof(MySqlTransaction)); 213 try 214 { 215 sqlBC.TableName = dataTable.TableName; 216 sqlBC.FieldTerminator = "|"; 217 sqlBC.LineTerminator = "\r\n"; 218 sqlBC.FileName = tmpCsvPath; 219 sqlBC.NumberOfLinesToSkip = 0; 220 221 StringCollection strCollection = new StringCollection(); 222 //Mapping Destination Field of Database Table 223 for (int i = 0; i < dataTable.Columns.Count; i++) 224 { 225 strCollection.Add(dataTable.Columns[i].ColumnName); 226 } 227 sqlBC.Columns = strCollection; 228 229 //Write DataTable 230 sqlBC.Load(); 231 232 sqlTran.Commit(); 233 result = true; 234 } 235 catch (MySqlException mse) 236 { 237 result = false; 238 sqlTran.Rollback(); 239 throw mse; 240 } 241 finally 242 { 243 //T、T1给默认值为Null, 由系统调用GC 244 sqlBC = null; 245 sqlBulkCopy = default(T); 246 sqlTrasaction = default(T1); 247 } 248 File.Delete(tmpCsvPath); 249 return result; 250 } 251 252 public bool BulkInsert(DataTable dataTable) 253 { 254 bool result = false; 255 if (dataTable != null && dataTable.Rows.Count > 0) 256 { 257 using (MySqlConnection mySqlCon = GetConnection<MySqlConnection>()) 258 { 259 mySqlCon.Open(); 260 MySqlTransaction sqlTran = mySqlCon.BeginTransaction(IsolationLevel.ReadCommitted); 261 MySqlBulkLoader sqlBulkCopy = new MySqlBulkLoader(mySqlCon); 262 sqlBulkCopy.Timeout = 60; 263 264 result = BulkInsert(sqlBulkCopy, dataTable, sqlTran); 265 } 266 } 267 return result; 268 } 269 270 public bool BulkInsert(DataSet dataSet) 271 { 272 bool result = false; 273 if (dataSet != null && dataSet.Tables.Count > 0) 274 { 275 using (MySqlConnection mySqlCon = GetConnection<MySqlConnection>()) 276 { 277 mySqlCon.Open(); 278 MySqlTransaction sqlTran = mySqlCon.BeginTransaction(IsolationLevel.ReadCommitted); 279 MySqlBulkLoader sqlBulkCopy = new MySqlBulkLoader(mySqlCon); 280 sqlBulkCopy.Timeout = 60; 281 282 if (dataSet.Tables.Count == 1) 283 result = BulkInsert(sqlBulkCopy, dataSet.Tables[0], sqlTran); 284 else 285 { 286 foreach (DataTable dt in dataSet.Tables) 287 { 288 result = BulkInsert(sqlBulkCopy, dt, sqlTran); 289 if (!result) 290 break; 291 } 292 } 293 } 294 } 295 return result; 296 } 297 298 public string DBName 299 { 300 get { return this._dbName; } 301 } 302 303 304 public T GetConnection<T>() 305 { 306 T result = default(T); 307 if (string.IsNullOrEmpty(this._dbName)) 308 result = DALFactory.GetDatabaseConnection<T>(this._dBVender); 309 else 310 result = DALFactory.GetDatabaseConnection<T>(this._dBVender, this._dbName); 311 return result; 312 } 313 314 #endregion 315 316 private void fillParameters(MySqlCommand mySqlCmd, string[] paramNames, object[] paramValues) 317 { 318 if (paramNames == null || paramNames.Length == 0) 319 return; 320 if (paramValues == null || paramValues.Length == 0) 321 return; 322 323 if (paramNames.Length != paramValues.Length) 324 throw new ArgumentException("The Name Count of parameters does not match its Value Count! "); 325 326 string name; 327 object value; 328 for (int i = 0; i < paramNames.Length; i++) 329 { 330 name = paramNames[i]; 331 value = paramValues[i]; 332 if (value != null) 333 mySqlCmd.Parameters.AddWithValue(name, value); 334 else 335 mySqlCmd.Parameters.AddWithValue(name, DBNull.Value); 336 } 337 } 338 } 339 }