• sqlite 资料总结


          SQLite,是一款轻型的数据库,是遵守ACID的关联式数据库管理系统,它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如 Tcl、C#、PHP、Java等,还有ODBC接口,同样比起Mysql、PostgreSQL这两款开源世界著名的数据库管理系统来讲,它的处理速度比他们都快。SQLite第一个Alpha版本诞生于2000年5月。 至今已经有12个年头,SQLite也迎来了一个版本 SQLite 3 已经发布。

          SQLite是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中。它是D.RichardHipp建立的公有领域项目。

      不像常见的客户-服务器范例,SQLite引擎不是个程序与之通信的独立进程,而是连接到程序中成为它的一个主要部分。所以主要的通信协议是在编程语言内的直接API调用。这在消耗总量、延迟时间和整体简单性上有积极的作用。整个数据库(定义、表、索引和数据本身)都在宿主主机上存储在一个单一的文件中。它的简单的设计是通过在开始一个事务的时候锁定整个数据文件而完成的。

    特性

    1. ACID事务;
    2. 零配置 – 无需安装和管理配;
    3. 储存在单一磁盘文件中的一个完整的数据库;
    4. 数据库文件可以在不同字节顺序的机器间自由的共享;
    5. 支持数据库大小至2TB;
    6. 足够小,大致3万行C代码, 250K;
    7. 比一些流行的数据库在大部分普通数据库操作要快;
    8. 简单,轻松的API;
    9. 包含TCL绑定, 同时通过Wrapper支持其他语言的绑定;
    10. 良好注释的源代码, 并且有着90%以上的测试覆盖率;
    11. 独立: 没有额外依赖;
    12. Source完全的Open,你可以用于任何用途, 包括出售它;
    13. 支持多种开发语言,C、PHP、Perl、Java、C#、Python。

          同时它还支持事务处理功能等等。也有人说它象Microsoft的Access,有时候真的觉得有点象,但是事实上它们区别很大。比如SQLite 支持跨平台,操作简单,能够使用很多语言直接创建数据库,而不象Access一样需要Office的支持。如果你是个很小型的应用,或者你想做嵌入式开发,没有合适的数据库系统,那么现在你可以考虑使用SQLite。目前它的最新版本是 3.7.8 。它的官方网站是:http://www.sqlite. org或者http://www.sqlite .com .cn,能在上面获得源代码和文档。同时因为数据库结构简单,系统源代码也不是很多,也适合想研究数据库系统开发的专业人士

    文件数据库

    文件数据库又叫嵌入式数据库,将整个数据库的内容保存在单个索引文件中,以便于数据库的发布。

    1、文件数据库的3个重要特征(相对于传统数据库)

    (1)数据操作接口
    SQL92标准,不管是传统数据库,还是文件数据库,都必须支持SQL92标准。

    (2)数据保存格式
    传统数据库(DB2, Oracle, SQL server等)数据保存的方式各异。
    文件数据库将数据保存在单一文件中。

    (3)API支持
    传统数据库都支持ODBC和JDBC。
    某些文件数据库不支持ODBC和JDBC(sqlite都不支持,Berkeley DB有ODBC和JDBC支持,Firdbird有第三方的ODBC驱动)。

    2、文件数据库与传统数据库的比较

    优势:由于数据保存在单一文件中,数据库的部署和发布都比较简单,适用于内嵌在应用程序中。
             数据量不是太大时,速度比传统数据库要快。

    缺点:由于数据保存在单一文件中,数据库打开时,该文件会被整个load到内存,应此数据库不能过大(100M以内,个人测试)。

    3、各种文件数据库的比较

    Sqlite:  老牌的文件数据库,完全免费 ( public domain ),使用方便,无须任何配置,下载源代码编译成库或者直接编译到应用程序都可以(250K,C代码)。支持事务机制和blob数据类型。http://www.sqlite.org/
    Berkerley DB: 更老牌的文件数据库,最稳定的数据库,完全可以取代大部分传统client/server数据库的应用场合;支持xml(代价是30M硬盘空间)。缺点是配置和使用比较复杂,不太适合小项目。
    Firbird:与sqlite比较类似,有C#支持。某些发布版本不能build, 很久没有关注了。
    Access:一般不考虑

    C# SQLiteHelper 类

    View Code
    using System;
    using System.Data;
    using System.Text.RegularExpressions;
    using System.Xml;
    using System.IO;
    using System.Collections;
    using System.Data.SQLite;
    
    namespace DBUtility.SQLite
    {
        /// <summary>
        /// SQLiteHelper is a utility class similar to "SQLHelper" in MS
        /// Data Access Application Block and follows similar pattern.
        /// </summary>
        public class SQLiteHelper
        {
            /// <summary>
            /// Creates a new <see cref="SQLiteHelper"/> instance. The ctor is marked private since all members are static.
            /// </summary>
            private SQLiteHelper()
            {
            }
            /// <summary>
            /// Creates the command.
            /// </summary>
            /// <param name="connection">Connection.</param>
            /// <param name="commandText">Command text.</param>
            /// <param name="commandParameters">Command parameters.</param>
            /// <returns>SQLite Command</returns>
            public static SQLiteCommand CreateCommand(SQLiteConnection connection, string commandText, params SQLiteParameter[] commandParameters)
            {
                SQLiteCommand cmd = new SQLiteCommand(commandText, connection);
                if (commandParameters.Length > 0)
                {
                    foreach (SQLiteParameter parm in commandParameters)
                        cmd.Parameters.Add(parm);
                }
                return cmd;
            }
    
            /// <summary>
            /// Creates the command.
            /// </summary>
            /// <param name="connectionString">Connection string.</param>
            /// <param name="commandText">Command text.</param>
            /// <param name="commandParameters">Command parameters.</param>
            /// <returns>SQLite Command</returns>
            public static SQLiteCommand CreateCommand(string connectionString, string commandText, params SQLiteParameter[] commandParameters)
            {
                SQLiteConnection cn = new SQLiteConnection(connectionString);
    
                SQLiteCommand cmd = new SQLiteCommand(commandText, cn);
    
                if (commandParameters.Length > 0)
                {
                    foreach (SQLiteParameter parm in commandParameters)
                        cmd.Parameters.Add(parm);
                }
                return cmd;
            }
            /// <summary>
            /// Creates the parameter.
            /// </summary>
            /// <param name="parameterName">Name of the parameter.</param>
            /// <param name="parameterType">Parameter type.</param>
            /// <param name="parameterValue">Parameter value.</param>
            /// <returns>SQLiteParameter</returns>
            public static SQLiteParameter CreateParameter(string parameterName, System.Data.DbType parameterType, object parameterValue)
            {
                SQLiteParameter parameter = new SQLiteParameter();
                parameter.DbType = parameterType;
                parameter.ParameterName = parameterName;
                parameter.Value = parameterValue;
                return parameter;
            }
    
            /// <summary>
            /// Shortcut method to execute dataset from SQL Statement and object[] arrray of parameter values
            /// </summary>
            /// <param name="connectionString">SQLite Connection string</param>
            /// <param name="commandText">SQL Statement with embedded "@param" style parameter names</param>
            /// <param name="paramList">object[] array of parameter values</param>
            /// <returns></returns>
            public static DataSet ExecuteDataSet(string connectionString, string commandText, object[] paramList)
            {
                SQLiteConnection cn = new SQLiteConnection(connectionString);
                SQLiteCommand cmd = cn.CreateCommand();
    
    
                cmd.CommandText = commandText;
                if (paramList != null)
                {
                    AttachParameters(cmd,commandText, paramList);
                }
                DataSet ds = new DataSet();
                if (cn.State == ConnectionState.Closed)
                    cn.Open();
                SQLiteDataAdapter da = new SQLiteDataAdapter(cmd);
                da.Fill(ds);
                da.Dispose();
                cmd.Dispose();
                cn.Close();
                return ds;
            }
            /// <summary>
            /// Shortcut method to execute dataset from SQL Statement and object[] arrray of  parameter values
            /// </summary>
            /// <param name="cn">Connection.</param>
            /// <param name="commandText">Command text.</param>
            /// <param name="paramList">Param list.</param>
            /// <returns></returns>
            public static DataSet ExecuteDataSet(SQLiteConnection cn, string commandText, object[] paramList)
            {
    
                SQLiteCommand cmd = cn.CreateCommand();
    
    
                cmd.CommandText = commandText;
                if (paramList != null)
                {
                    AttachParameters(cmd,commandText, paramList);
                }
                DataSet ds = new DataSet();
                if (cn.State == ConnectionState.Closed)
                    cn.Open();
                SQLiteDataAdapter da = new SQLiteDataAdapter(cmd);
                da.Fill(ds);
                da.Dispose();
                cmd.Dispose();
                cn.Close();
                return ds;
            }
            /// <summary>
            /// Executes the dataset from a populated Command object.
            /// </summary>
            /// <param name="cmd">Fully populated SQLiteCommand</param>
            /// <returns>DataSet</returns>
            public static DataSet ExecuteDataset(SQLiteCommand cmd)
            {
                if (cmd.Connection.State == ConnectionState.Closed)
                    cmd.Connection.Open();
                DataSet ds = new DataSet();
                SQLiteDataAdapter da = new SQLiteDataAdapter(cmd);
                da.Fill(ds);
                da.Dispose();
                cmd.Connection.Close();
                cmd.Dispose();
                return ds;
            }
    
            /// <summary>
            /// Executes the dataset in a SQLite Transaction
            /// </summary>
            /// <param name="transaction">SQLiteTransaction. Transaction consists of Connection, Transaction,  /// and Command, all of which must be created prior to making this method call. </param>
            /// <param name="commandText">Command text.</param>
            /// <param name="commandParameters">Sqlite Command parameters.</param>
            /// <returns>DataSet</returns>
            /// <remarks>user must examine Transaction Object and handle transaction.connection .Close, etc.</remarks>
            public static DataSet ExecuteDataset(SQLiteTransaction transaction, string commandText, params SQLiteParameter[] commandParameters)
            {
    
                if (transaction == null) throw new ArgumentNullException("transaction");
                if (transaction != null && transaction.Connection == null) throw new ArgumentException("The transaction was rolled back or committed, please provide an open transaction.", "transaction");
                IDbCommand cmd = transaction.Connection.CreateCommand();
                cmd.CommandText = commandText;
                foreach (SQLiteParameter parm in commandParameters)
                {
                    cmd.Parameters.Add(parm);
                }
                if (transaction.Connection.State == ConnectionState.Closed)
                    transaction.Connection.Open();
                DataSet ds = ExecuteDataset((SQLiteCommand)cmd);
                return ds;
            }
    
            /// <summary>
            /// Executes the dataset with Transaction and object array of parameter values.
            /// </summary>
            /// <param name="transaction">SQLiteTransaction. Transaction consists of Connection, Transaction,    /// and Command, all of which must be created prior to making this method call. </param>
            /// <param name="commandText">Command text.</param>
            /// <param name="commandParameters">object[] array of parameter values.</param>
            /// <returns>DataSet</returns>
            /// <remarks>user must examine Transaction Object and handle transaction.connection .Close, etc.</remarks>
            public static DataSet ExecuteDataset(SQLiteTransaction transaction, string commandText, object[] commandParameters)
            {
    
                if (transaction == null) throw new ArgumentNullException("transaction");
                if (transaction != null && transaction.Connection == null) throw new ArgumentException("The transaction was rolled back or committed,                                                          please provide an open transaction.", "transaction");
                IDbCommand cmd = transaction.Connection.CreateCommand();
                cmd.CommandText = commandText;
                AttachParameters((SQLiteCommand)cmd,cmd.CommandText, commandParameters);
                if (transaction.Connection.State == ConnectionState.Closed)
                    transaction.Connection.Open();
    
                DataSet ds = ExecuteDataset((SQLiteCommand)cmd);
                return ds;
            }
    
            #region UpdateDataset
            /// <summary>
            /// Executes the respective command for each inserted, updated, or deleted row in the DataSet.
            /// </summary>
            /// <remarks>
            /// e.g.:  
            ///  UpdateDataset(conn, insertCommand, deleteCommand, updateCommand, dataSet, "Order");
            /// </remarks>
            /// <param name="insertCommand">A valid SQL statement  to insert new records into the data source</param>
            /// <param name="deleteCommand">A valid SQL statement to delete records from the data source</param>
            /// <param name="updateCommand">A valid SQL statement used to update records in the data source</param>
            /// <param name="dataSet">The DataSet used to update the data source</param>
            /// <param name="tableName">The DataTable used to update the data source.</param>
            public static void UpdateDataset(SQLiteCommand insertCommand, SQLiteCommand deleteCommand, SQLiteCommand updateCommand, DataSet dataSet, string tableName)
            {
                if (insertCommand == null) throw new ArgumentNullException("insertCommand");
                if (deleteCommand == null) throw new ArgumentNullException("deleteCommand");
                if (updateCommand == null) throw new ArgumentNullException("updateCommand");
                if (tableName == null || tableName.Length == 0) throw new ArgumentNullException("tableName");
    
                // Create a SQLiteDataAdapter, and dispose of it after we are done
                using (SQLiteDataAdapter dataAdapter = new SQLiteDataAdapter())
                {
                    // Set the data adapter commands
                    dataAdapter.UpdateCommand = updateCommand;
                    dataAdapter.InsertCommand = insertCommand;
                    dataAdapter.DeleteCommand = deleteCommand;
    
                    // Update the dataset changes in the data source
                    dataAdapter.Update(dataSet, tableName);
    
                    // Commit all the changes made to the DataSet
                    dataSet.AcceptChanges();
                }
            }
            #endregion
    
    
    
    
            /// <summary>
            /// ShortCut method to return IDataReader
            /// NOTE: You should explicitly close the Command.connection you passed in as
            /// well as call Dispose on the Command  after reader is closed.
            /// We do this because IDataReader has no underlying Connection Property.
            /// </summary>
            /// <param name="cmd">SQLiteCommand Object</param>
            /// <param name="commandText">SQL Statement with optional embedded "@param" style parameters</param>
            /// <param name="paramList">object[] array of parameter values</param>
            /// <returns>IDataReader</returns>
            public static IDataReader ExecuteReader(SQLiteCommand cmd, string commandText, object[] paramList)
            {
                if (cmd.Connection == null)
                    throw new ArgumentException("Command must have live connection attached.", "cmd");
                cmd.CommandText = commandText;
                AttachParameters(cmd,commandText, paramList);
                if (cmd.Connection.State == ConnectionState.Closed)
                    cmd.Connection.Open();
                IDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
                return rdr;
            }
    
            /// <summary>
            /// Shortcut to ExecuteNonQuery with SqlStatement and object[] param values
            /// </summary>
            /// <param name="connectionString">SQLite Connection String</param>
            /// <param name="commandText">Sql Statement with embedded "@param" style parameters</param>
            /// <param name="paramList">object[] array of parameter values</param>
            /// <returns></returns>
            public static int ExecuteNonQuery(string connectionString, string commandText, params object[] paramList)
            {
                SQLiteConnection cn = new SQLiteConnection(connectionString);
                SQLiteCommand cmd = cn.CreateCommand();
                cmd.CommandText = commandText;
                AttachParameters(cmd,commandText, paramList);
                if (cn.State == ConnectionState.Closed)
                    cn.Open();
                int result = cmd.ExecuteNonQuery();
                cmd.Dispose();
                cn.Close();
    
                return result;
            }
    
    
    
            public static int ExecuteNonQuery(SQLiteConnection cn, string commandText, params  object[] paramList)
            {
    
                SQLiteCommand cmd = cn.CreateCommand();
                cmd.CommandText = commandText;
                AttachParameters(cmd,commandText, paramList);
                if (cn.State == ConnectionState.Closed)
                    cn.Open();
                int result = cmd.ExecuteNonQuery();
                cmd.Dispose();
                cn.Close();
    
                return result;
            }
    
            /// <summary>
            /// Executes  non-query sql Statment with Transaction
            /// </summary>
            /// <param name="transaction">SQLiteTransaction. Transaction consists of Connection, Transaction,   /// and Command, all of which must be created prior to making this method call. </param>
            /// <param name="commandText">Command text.</param>
            /// <param name="paramList">Param list.</param>
            /// <returns>Integer</returns>
            /// <remarks>user must examine Transaction Object and handle transaction.connection .Close, etc.</remarks>
            public static int ExecuteNonQuery(SQLiteTransaction transaction, string commandText, params  object[] paramList)
            {
                if (transaction == null) throw new ArgumentNullException("transaction");
                if (transaction != null && transaction.Connection == null) throw new ArgumentException("The transaction was rolled back or committed,                                                        please provide an open transaction.", "transaction");
                IDbCommand cmd = transaction.Connection.CreateCommand();
                cmd.CommandText = commandText;
                AttachParameters((SQLiteCommand)cmd,cmd.CommandText, paramList);
                if (transaction.Connection.State == ConnectionState.Closed)
                    transaction.Connection.Open();
                int result = cmd.ExecuteNonQuery();
                cmd.Dispose();
                return result;
            }
    
    
            /// <summary>
            /// Executes the non query.
            /// </summary>
            /// <param name="cmd">CMD.</param>
            /// <returns></returns>
            public static int ExecuteNonQuery(IDbCommand cmd)
            {
                if (cmd.Connection.State == ConnectionState.Closed)
                    cmd.Connection.Open();
                int result = cmd.ExecuteNonQuery();
                cmd.Connection.Close();
                cmd.Dispose();
                return result;
            }
    
            /// <summary>
            /// Shortcut to ExecuteScalar with Sql Statement embedded params and object[] param values
            /// </summary>
            /// <param name="connectionString">SQLite Connection String</param>
            /// <param name="commandText">SQL statment with embedded "@param" style parameters</param>
            /// <param name="paramList">object[] array of param values</param>
            /// <returns></returns>
            public static object ExecuteScalar(string connectionString, string commandText, params  object[] paramList)
            {
                SQLiteConnection cn = new SQLiteConnection(connectionString);
                SQLiteCommand cmd = cn.CreateCommand();
                cmd.CommandText = commandText;
                AttachParameters(cmd,commandText, paramList);
                if (cn.State == ConnectionState.Closed)
                    cn.Open();
                object result = cmd.ExecuteScalar();
                cmd.Dispose();
                cn.Close();
    
                return result;
            }
    
            /// <summary>
            /// Execute XmlReader with complete Command
            /// </summary>
            /// <param name="command">SQLite Command</param>
            /// <returns>XmlReader</returns>
            public static XmlReader ExecuteXmlReader(IDbCommand command)
            { // open the connection if necessary, but make sure we 
                // know to close it when we�re done.
                if (command.Connection.State != ConnectionState.Open)
                {
                    command.Connection.Open();
                }
    
                // get a data adapter  
                SQLiteDataAdapter da = new SQLiteDataAdapter((SQLiteCommand)command);
                DataSet ds = new DataSet();
                // fill the data set, and return the schema information
                da.MissingSchemaAction = MissingSchemaAction.AddWithKey;
                da.Fill(ds);
                // convert our dataset to XML
                StringReader stream = new StringReader(ds.GetXml());
                command.Connection.Close();
                // convert our stream of text to an XmlReader
                return new XmlTextReader(stream);
            }
    
    
    
            /// <summary>
            /// Parses parameter names from SQL Statement, assigns values from object array ,   /// and returns fully populated ParameterCollection.
            /// </summary>
            /// <param name="commandText">Sql Statement with "@param" style embedded parameters</param>
            /// <param name="paramList">object[] array of parameter values</param>
            /// <returns>SQLiteParameterCollection</returns>
            /// <remarks>Status experimental. Regex appears to be handling most issues. Note that parameter object array must be in same ///order as parameter names appear in SQL statement.</remarks>
            private static SQLiteParameterCollection AttachParameters(SQLiteCommand cmd, string commandText, params  object[] paramList)
            {
                if (paramList == null || paramList.Length == 0) return null;
    
                SQLiteParameterCollection coll = cmd.Parameters;
                string parmString = commandText.Substring(commandText.IndexOf("@"));
                // pre-process the string so always at least 1 space after a comma.
                parmString = parmString.Replace(",", " ,");
                // get the named parameters into a match collection
                string pattern = @"(@)\S*(.*?)\b";
                Regex ex = new Regex(pattern, RegexOptions.IgnoreCase);
                MatchCollection mc = ex.Matches(parmString);
                string[] paramNames = new string[mc.Count];
                int i = 0;
                foreach (Match m in mc)
                {
                    paramNames[i] = m.Value;
                    i++;
                }
    
                // now let's type the parameters
                int j = 0;
                Type t = null;
                foreach (object o in paramList)
                {
                    t = o.GetType();
    
                    SQLiteParameter parm = new SQLiteParameter();
                    switch (t.ToString())
                    {
    
                        case ("DBNull"):
                        case ("Char"):
                        case ("SByte"):
                        case ("UInt16"):
                        case ("UInt32"):
                        case ("UInt64"):
                            throw new SystemException("Invalid data type");
    
    
                        case ("System.String"):
                            parm.DbType = DbType.String;
                            parm.ParameterName = paramNames[j];
                            parm.Value = (string)paramList[j];
                            coll.Add(parm);
                            break;
    
                        case ("System.Byte[]"):
                            parm.DbType = DbType.Binary;
                            parm.ParameterName = paramNames[j];
                            parm.Value = (byte[])paramList[j];
                            coll.Add(parm);
                            break;
    
                        case ("System.Int32"):
                            parm.DbType = DbType.Int32;
                            parm.ParameterName = paramNames[j];
                            parm.Value = (int)paramList[j];
                            coll.Add(parm);
                            break;
    
                        case ("System.Boolean"):
                            parm.DbType = DbType.Boolean;
                            parm.ParameterName = paramNames[j];
                            parm.Value = (bool)paramList[j];
                            coll.Add(parm);
                            break;
    
                        case ("System.DateTime"):
                            parm.DbType = DbType.DateTime;
                            parm.ParameterName = paramNames[j];
                            parm.Value = Convert.ToDateTime(paramList[j]);
                            coll.Add(parm);
                            break;
    
                        case ("System.Double"):
                            parm.DbType = DbType.Double;
                            parm.ParameterName = paramNames[j];
                            parm.Value = Convert.ToDouble(paramList[j]);
                            coll.Add(parm);
                            break;
    
                        case ("System.Decimal"):
                            parm.DbType = DbType.Decimal;
                            parm.ParameterName = paramNames[j];
                            parm.Value = Convert.ToDecimal(paramList[j]);
                            break;
    
                        case ("System.Guid"):
                            parm.DbType = DbType.Guid;
                            parm.ParameterName = paramNames[j];
                            parm.Value = (System.Guid)(paramList[j]);
                            break;
    
                        case ("System.Object"):
    
                            parm.DbType = DbType.Object;
                            parm.ParameterName = paramNames[j];
                            parm.Value = paramList[j];
                            coll.Add(parm);
                            break;
    
                        default:
                            throw new SystemException("Value is of unknown data type");
    
                    } // end switch
    
                    j++;
                }
                return coll;
            }
    
            /// <summary>
            /// Executes non query typed params from a DataRow
            /// </summary>
            /// <param name="command">Command.</param>
            /// <param name="dataRow">Data row.</param>
            /// <returns>Integer result code</returns>
            public static int ExecuteNonQueryTypedParams(IDbCommand command, DataRow dataRow)
            {
                int retVal = 0;
    
                // If the row has values, the store procedure parameters must be initialized
                if (dataRow != null && dataRow.ItemArray.Length > 0)
                {
                    // Set the parameters values
                    AssignParameterValues(command.Parameters, dataRow);
    
                    retVal = ExecuteNonQuery(command);
                }
                else
                {
                    retVal = ExecuteNonQuery(command);
                }
    
                return retVal;
            }
    
            /// <summary>
            /// This method assigns dataRow column values to an IDataParameterCollection
            /// </summary>
            /// <param name="commandParameters">The IDataParameterCollection to be assigned values</param>
            /// <param name="dataRow">The dataRow used to hold the command's parameter values</param>
            /// <exception cref="System.InvalidOperationException">Thrown if any of the parameter names are invalid.</exception>
            protected internal static void AssignParameterValues(IDataParameterCollection commandParameters, DataRow dataRow)
            {
                if (commandParameters == null || dataRow == null)
                {
                    // Do nothing if we get no data
                    return;
                }
    
                DataColumnCollection columns = dataRow.Table.Columns;
    
                int i = 0;
                // Set the parameters values
                foreach (IDataParameter commandParameter in commandParameters)
                {
                    // Check the parameter name
                    if (commandParameter.ParameterName == null ||
                     commandParameter.ParameterName.Length <= 1)
                        throw new InvalidOperationException(string.Format(
                               "Please provide a valid parameter name on the parameter #{0},                            the ParameterName property has the following value: '{1}'.",
                         i, commandParameter.ParameterName));
    
                    if (columns.Contains(commandParameter.ParameterName))
                        commandParameter.Value = dataRow[commandParameter.ParameterName];
                    else if (columns.Contains(commandParameter.ParameterName.Substring(1)))
                        commandParameter.Value = dataRow[commandParameter.ParameterName.Substring(1)];
    
                    i++;
                }
            }
    
            /// <summary>
            /// This method assigns dataRow column values to an array of IDataParameters
            /// </summary>
            /// <param name="commandParameters">Array of IDataParameters to be assigned values</param>
            /// <param name="dataRow">The dataRow used to hold the stored procedure's parameter values</param>
            /// <exception cref="System.InvalidOperationException">Thrown if any of the parameter names are invalid.</exception>
            protected void AssignParameterValues(IDataParameter[] commandParameters, DataRow dataRow)
            {
                if ((commandParameters == null) || (dataRow == null))
                {
                    // Do nothing if we get no data
                    return;
                }
    
                DataColumnCollection columns = dataRow.Table.Columns;
    
                int i = 0;
                // Set the parameters values
                foreach (IDataParameter commandParameter in commandParameters)
                {
                    // Check the parameter name
                    if (commandParameter.ParameterName == null ||
                     commandParameter.ParameterName.Length <= 1)
                        throw new InvalidOperationException(string.Format(
                         "Please provide a valid parameter name on the parameter #{0}, the ParameterName property has the following value: '{1}'.",
                         i, commandParameter.ParameterName));
    
                    if (columns.Contains(commandParameter.ParameterName))
                        commandParameter.Value = dataRow[commandParameter.ParameterName];
                    else if (columns.Contains(commandParameter.ParameterName.Substring(1)))
                        commandParameter.Value = dataRow[commandParameter.ParameterName.Substring(1)];
    
                    i++;
                }
            }
    
            /// <summary>
            /// This method assigns an array of values to an array of IDataParameters
            /// </summary>
            /// <param name="commandParameters">Array of IDataParameters to be assigned values</param>
            /// <param name="parameterValues">Array of objects holding the values to be assigned</param>
            /// <exception cref="System.ArgumentException">Thrown if an incorrect number of parameters are passed.</exception>
            protected void AssignParameterValues(IDataParameter[] commandParameters, params  object[] parameterValues)
            {
                if ((commandParameters == null) || (parameterValues == null))
                {
                    // Do nothing if we get no data
                    return;
                }
    
                // We must have the same number of values as we pave parameters to put them in
                if (commandParameters.Length != parameterValues.Length)
                {
                    throw new ArgumentException("Parameter count does not match Parameter Value count.");
                }
    
                // Iterate through the IDataParameters, assigning the values from the corresponding position in the 
                // value array
                for (int i = 0, j = commandParameters.Length, k = 0; i < j; i++)
                {
                    if (commandParameters[i].Direction != ParameterDirection.ReturnValue)
                    {
                        // If the current array value derives from IDataParameter, then assign its Value property
                        if (parameterValues[k] is IDataParameter)
                        {
                            IDataParameter paramInstance;
                            paramInstance = (IDataParameter)parameterValues[k];
                            if (paramInstance.Direction == ParameterDirection.ReturnValue)
                            {
                                paramInstance = (IDataParameter)parameterValues[++k];
                            }
                            if (paramInstance.Value == null)
                            {
                                commandParameters[i].Value = DBNull.Value;
                            }
                            else
                            {
                                commandParameters[i].Value = paramInstance.Value;
                            }
                        }
                        else if (parameterValues[k] == null)
                        {
                            commandParameters[i].Value = DBNull.Value;
                        }
                        else
                        {
                            commandParameters[i].Value = parameterValues[k];
                        }
                        k++;
                    }
                }
            }
        }
    }

    参考:http://baike.baidu.com/view/19310.htm
            http://www.cnblogs.com/yukaizhao/archive/2008/12/01/sqlitehelper.html
            http://blog.csdn.net/dengyunze/article/details/599331

  • 相关阅读:
    普联的路由器TL-WR842N和TL-WR845N还有 TL-WR847N哪一个更好,我是家用
    z
    EF架构~XMLRepository仓储的实现~续(XAttribute方式)
    缓存篇(Cache)~第三回 HttpModule实现网页的文件级缓存
    爱上MVC系列~带扩展名的路由失效问题
    开发人员应该对IIS理论层的知识了解的多一些~第四讲 HttpModule中的几大事件
    缓存篇(Cache)~第二回 使用static静态成员实现服务器端缓存(导航面包屑)~续
    一分钟对我们的重要意义
    VS2010添加默认路径,库以及Lib
    Android中振动器(Vibrator)的使用
  • 原文地址:https://www.cnblogs.com/adforce/p/2794645.html
Copyright © 2020-2023  润新知