当前位置: 首页 > 编程日记 > 正文

C# SQLiteHelper类似SqlHelper类实现存取Sqlite数据库

这个类不是我实现的,原文在这里,我修改了原文中分析sql语句参数的方法,将方法名修改为AttachParameters,将其修饰符修改为private,并直接传递command到这个方法,直接绑定参数到comand。修改后的代码如下

ContractedBlock.gifExpandedBlockStart.gifSQLiteHelper实现
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 == nullthrow new ArgumentNullException("transaction");
            
if (transaction != null && transaction.Connection == nullthrow 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 == nullthrow new ArgumentNullException("transaction");
            
if (transaction != null && transaction.Connection == nullthrow 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 == nullthrow new ArgumentNullException("insertCommand");
            
if (deleteCommand == nullthrow new ArgumentNullException("deleteCommand");
            
if (updateCommand == nullthrow new ArgumentNullException("updateCommand");
            
if (tableName == null || tableName.Length == 0throw 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 == nullthrow new ArgumentNullException("transaction");
            
if (transaction != null && transaction.Connection == nullthrow 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 == 0return 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
++;
                }
            }
        }
    }
}

相关文章:

Skype for Business Server 2015-03-后端服务器-0-准备

1. 规划-拓朴图 2. 规划-服务器 3. 准备-软件 Sql Server 2014&#xff1a; cn_sql_server_2014_enterprise_edition_x64_dvd_3932882.iso Sql Server 2014 CU6: Cumulative update package 6 for SQL Server 2014 https://support.microsoft.com/en-us/kb/3031047 4. 准备-虚拟…

html文档使用,使用提供 HTML 文档的过程

使用提供 HTML 文档的过程通常&#xff0c;编写一个可处理发送给特定服务的请求的过程是最简单的方式。这样的过程将返回一个 Web 页。或者&#xff0c;该过程也可接受作为 URL 的一部分进行传递的参数以对其输出进行自定义。但以下示例要简单很多。它例示了服务可以简单到什么…

这样学算法,包会包懂so easy~

整理 | Jane出品 | AI科技大本营面试前&#xff0c;大家都会开始刷各类网站&#xff0c;希望能在算法之道上有所进益&#xff0c;也期待有幸能在面试中碰上原题&#xff0c;而在那么多的网站中&#xff0c;LeetCode 一定是候选学习的网站之一。但是 LeetCode 网站上的题量和难度…

上映 10 天,票房就突破 10 亿的《海王》真的有那么好看?

出品&#xff1a;CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;写在前面本文将主要通过Python加上一些数据分析&#xff0c;来证明《海王》好看。《海王》一部电影带你重温《驯龙高手》《变形金刚》《星球大战》《星河战队》《铁血战士》《安德的游戏》《异形》可能还借…

利用SMS OSD实现win2008操作系统的部署

我们知道SMS是一个强大的桌面操作系统&#xff0c;利用SMS可以实现对客户端的软件、硬件等数据的统计&#xff0c;还可以管理公司的资产等等。那么利用SMS OSD是否能部署出XP、win2003、win2008等操作系统呢&#xff1f;今天我们就来试试用SMS OSD来部署win2008操作系统&#x…

企业域名更换操作系列1:为什么要进行域名更换及更换需要注意事项

前段时间在公司讨论对现在域结构调整时&#xff0c;有提到希望能重新启一套域,将现在域内信息全部进行迁移,迁移完成后再把域名改为原域名&#xff0c;此问题从愿景上来看是不错的&#xff0c;因为这种方法虽然操作比较复杂,但是对于用户体验上来看&#xff0c;还是有一定的帮助…

html在页面上div绝对定位,html – 中心浮动div在绝对定位div内

我有这套html和CSS.我想要的是必须让小的小工具块向左浮动但是在绝对定位的小工具包装器内部居中.因此,小工具包装器绝对位于页面底部.它包含x个小工具,它们在包装器内部浮动.所有这些小工具应该在包装器中居中 – 这是可能的,如何……&#xff1f;这真是让我伤心….1not setno…

主角用计算机控制身体,国漫段子手:绝技,用计算机控制挖掘机炒菜

身为古神的叶辰从神境世界陨落到了苍蓝世界&#xff0c;这里百州千国林立&#xff0c;豪强争霸&#xff0c;叶辰在这个苍蓝世界呆了数百年&#xff0c;建立了庞大的势力。在百州千国&#xff0c;叶辰的存在一直都是一个传说。但是来自神境世界的力量慢慢地延伸到了苍蓝世界&…

2018热点总结:BERT最热,GANs最活跃,每20分钟就有一篇论文...

作者 | Ross Taylor 译者 | linstancy 整理 | Jane 出品 | AI科技大本营 【导读】本文的作者 Ross Taylor 和 Robert Stojnic 在今年一起启动了一个名为“Paper with Code”的项目&#xff0c;将 AI 领域的一些研究论文和论文开源代码结合展示&#xff0c;方便大家学习与研究…

android之android.intent.category.DEFAULT的用途和使用

1、要弄清楚这个问题&#xff0c;首先需要弄明白什么是implicit(隐藏) intent什么是explicit(明确) intent。 Explicit Intent明确的指定了要启动的Acitivity &#xff0c;比如以下Java代码&#xff1a; [java] view plaincopy print? Intent intent new Intent(this, B.class…

MS sql server和mysql中update多条数据的例子

1.MS sql server中使用动态的表名&#xff1a;declare tableName nvarchar(160)set tableName t_stat_alldeclare sql nvarchar(160)print tableNameset sqlselect count(*) from tableNameexec(sql)2.mysql的例子1语句update (select sc,tos,sum(click) as click,product,adp…

OpenGL编程轻松入门(四)

1. 曲面和曲线前面我们讲了如何绘制平面的图形&#xff0c;这一节我们学习如何绘制曲线和曲面。例10&#xff1a;绘制一个曲面&#xff0c;本程序使用二维求值器绘制一个曲面。本例中也有一些特殊效果的操作。#include <windows.h>#include <GL/GLAUX.h>#i…

计算机科学实验教学示范中心,校领导调研计算机科学与技术国家级实验教学示范中心...

4月29日&#xff0c;副校长朱廷珺在实验管理中负责人陪同下&#xff0c;深入计算机科学与技术国家级实验教学示范中心、轨道交通信息与控制国家级虚拟仿真实验教学中心开展实地调研。在计算机实验中心&#xff0c;朱廷珺实地调研了计算机基础实验室、计算机软件实验室、硬件专业…

中科创达孙力:不迷信 AI 算法,智能视觉如何转型升级?

作者 | 若名 出品 | AI科技大本营 近日&#xff0c;中科创达副总裁孙力在 Thunder World 2018 嵌入式 AI 人工智能技术大会上发表了主题演讲&#xff0c;主要分享了以下三方面内容&#xff1a; 视觉的传统技术和挑战 嵌入式视觉AI智能视觉 智能视觉赋能行业的智能化升级转型 …

单元测试与敏捷开发

单元测试与敏捷开发 转载请保留作者信息&#xff1a; 作者&#xff1a;88250 Blog&#xff1a;http:/blog.csdn.net/DL88250 MSN & Gmail & QQ&#xff1a;DL88250gmail.com 在要求项目要尽量快地实现的时候&#xff0c;质量与开发进度上会出现一定的矛盾&#xff0c;…

“AI明星”第四范式C轮融资超10亿元,估值约12亿美元

AI科技大本营消息&#xff0c;12 月 19 日&#xff0c;第四范式宣布完成 C 轮融资&#xff0c;融资金额超过 10 亿元&#xff0c;估值约 12 亿美元。此次投资引入了包括国新、启迪、保利、三峡、中信、农银、交银等战略投资&#xff0c;红杉中国继续追加投资。除了原有股东中国…

精灵图 html为什么会变大,[html] 第128天 精灵图和base64如何选择呢?

可参考https://www.cnblogs.com/wangqi2019/p/10498627.htmlCss Sprites(雪碧图或css精灵)&#xff0c;是网页图片处理的一种方式&#xff0c;它允许你将一个页面涉及到的所有零星图片都包含到一张大图中去&#xff0c;这样一来&#xff0c;当访问该页面时&#xff0c;载入的图…

组策略 从入门到精通(十)通过组策略进行软件分发和卸载

其实在前面windows server 2008的一些博文中&#xff0c;已经介绍了如何通过组策略进行软件的分发&#xff0c;在windows server 2003中有些无法完成的软件分发工作在windows server 2008中已经全部纠正了。http://zhengweiit.blog.51cto.com/1109863/291156 今天我们主要来探讨…

RedHatAS4.0-RAID技术

RedHatAS4.0-RAID技术

今晚8点直播 | 详解基于百度自定义模板的OCR结果结构化处理技术

随着行业的发展和技术的成熟&#xff0c;文字识别&#xff08;OCR&#xff09;目前已经应用到了多个行业中&#xff0c;比如物流行业快递包裹的分拣&#xff0c;金融行业的支票单据识别输入&#xff0c;交通领域中的车牌识别&#xff0c;以及日常生活中的卡证、票据识别等等。O…

电脑计算机科学型,电脑里附带的计算器有标准型和科学型二种,它 – 手机爱问...

2019-06-24如何用delphi7 0设计标准型计算器这是源代码&#xff1a;unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Buttons, StdCtrls, ExtCtrls;type TForm1 class(TForm) Panel1: TPanel; Panel…

铜缆配线架的选择

我们现在考察一下为安装选择合适的铜缆配线架所必须考虑的因素。铜缆配线架一般分为经济型、中端或高端配线架。经济型配线架经济型配线架通常在结构上脆弱&#xff0c;性能不稳定交缺少技术支持或保证。配线架端接时一般会耗费较多的安装成本&#xff0c;没有电缆管理设备支持…

go6---slice切片

package main/* 切片Slice 其本身并不是数组&#xff0c;它指向底层的数组 作为变长数组的替代方案&#xff0c;可以关联底层数组的局部或全部 为引用类型 可以直接创建或从底层数组获取生成 使用len()获取元素个数&#xff0c;cap()获取容量 一般使用make()创建 如果多个slice…

TensorFlow支持Unicode,中文NLP终于省心了

整理 | 非主流出品 | AI科技大本营终于&#xff0c;TensorFlow 增加了对 Unicode 的支持。什么是 Unicode&#xff1f;Unicode 是计算机科学领域里的一项业界标准&#xff0c;包括字符集、编码方案等。Unicode 是为了解决传统的字符编码方案的局限而产生的&#xff0c;它为每种…

C#:String.Format数字格式化输出

C#:String.Format数字格式化输出 inta 12345678; //格式为sring输出//Label1.Text string.Format("asdfadsf{0}adsfasdf",a);//Label2.Text "asdfadsf"a.ToString()"adsfasdf";//Label1.Text string.Format("asdfadsf{0:C}adsfasdf&…

OpenStack如何实现高可用集群介绍

OpenStack是目前基于开源的&#xff0c;一个非常流行的云管理平台项目。这个项目由几个主要的组件组合起来完成一些具体的工作。因此它的集群比较复杂&#xff0c;也有多种选择方式。OpenStack 作为一个类似于 Amazon EC2 和 S3 的云基础架构服务(Infrastructure as a Service,…

accp8.0html作业,Accp8.0HTML标签

第一章1、HTML超文本标记语言2、网页3、网页头部4、网页标题5、网页主体6、DOCTYPE声明3种级别&#xff1a;(1)Strict 严格类型(2)Transitional过渡类型(3)Frameset框架类型7、网页摘要标签8、字符编码&#xff1a;gb2312简体中文ISO-885901纯英文big5繁体UTF-8国际通用编码9、…

向iOS越狱彻底说再见!

老牌第三方软件商店 Cydia 关闭在即&#xff0c;iPhone 越狱时代又见落日归途&#xff1f;作者 | 仲培艺出品 | CSDNCydia 线上商店是针对完成越狱的 iOS 设备的一种破解软件&#xff0c;在越狱过程中被装入到系统&#xff0c;为 iOS 设备提供第三方 App 的服务平台&#xff0c…

ArrayList的subList方法

李说&#xff1a; ArrayList的subList方法获取到的是ArrayList的一段list&#xff0c;只是其中的一段视图。所以修改subList ,ArrayList同时会修改&#xff0c;因为本来就是同一个东西。 jdk文档中是这样说的&#xff1a; List<E> subList(int fromIndex, int toIndex) …

男孩子学计算机和学医哪个好,你认为学医好还是读211大学的电子信息好?

学医的好处。社会的地位和社会认可度较高。无可否认无论是在过去还是在将来&#xff0c;医生因为其救死扶伤的职业特点而被广泛大众所接受和认可。较高的社会地位会让你在将来的择偶、人际关系处理方面显得更有吸引力和话语权。工作稳定有保障。这点其实还是看题主的水平和实力…