来自 数据库 2020-04-30 11:36 的文章
当前位置: 网上澳门金莎娱乐 > 数据库 > 正文

网上澳门金莎娱乐:Enterprise Library2.0数据库常用操作

复制代码 代码如下: public bool SaveSMSMessage(SMSBatch smsBatch, DataSet smsMessages) { //using (TransactionScope ts = new TransactionScope(TransactionScopeOption.Suppress)) //{ foreach (DataRow row in smsMessages.Tables[0].Rows) row.SetModified(); SqlDatabase db = new SqlDatabase(this.ConsultantsConnString); string sqlCmd = "EXEC cn.SMSSaveSMSMessage @SMSBatchID, @SMSTypeID, @SubsidiaryID, @ContactID, @Message, @PhoneNumber"; using (SqlCommand cmd = db.GetSqlStringCommand(sqlCmd) as SqlCommand) { cmd.CommandTimeout = 600; cmd.Parameters.AddWithValue("@SMSBatchID", smsBatch.SMSBatchID); cmd.Parameters.AddWithValue("@SMSTypeID", smsBatch.SMSType.SMSTypeID); cmd.Parameters.AddWithValue("@SubsidiaryID", smsBatch.SMSType.SubsidiaryID); db.AddInParameter(cmd, "@ContactID", DbType.Int64, "ContactID", DataRowVersion.Current); db.AddInParameter(cmd, "@Message", DbType.String, "Message", DataRowVersion.Current); if (smsMessages.Tables[0].Columns.Contains("PhoneNumber")) { db.AddInParameter(cmd, "@PhoneNumber", DbType.String, "PhoneNumber", DataRowVersion.Current); } else { db.AddInParameter(cmd, "@PhoneNumber", DbType.String, DBNull.Value); } int rowsEffected = db.UpdateDataSet(smsMessages, "SMSMessage", null, cmd, null, UpdateBehavior.Transactional); sqlCmd = rowsEffected.ToString(); } // ts.Complete(); //} return true; }

今天学习了Enterprise Library2.0的Data Access Application Block,Data Access Application Block提供了通用的数据访问的功能,随着2.0版本的推出有了很大变化。俺就多写了对SQL和ACCESS数据库自由切换的一些代码出来共享。先看完原文再接俺的代码吧。

一.改进

在DAAB1.1里面我们知道Database方法返回或者创建一个DBCommandWrapper对象,而在DAAB2.0里面移除了DBCommandWrapper类,用ADO.NET2.0里面的DBCommand类代替实现类似的功能,这样使得DAAB跟我们的.NET类库的结合更加紧密,回忆一下我们在1.1里面用DBCommandWrapper来访问数据时的代码:

网上澳门金莎娱乐 1Database db = DatabaseFactory.CreateDatabase();
网上澳门金莎娱乐 2
网上澳门金莎娱乐 3DBCommandWrapper dbCommand = db.GetStoredProcCommandWrapper("GetProductsByCategory");
网上澳门金莎娱乐 4
网上澳门金莎娱乐 5dbCommand.AddInParameter("CategoryID", DbType.Int32, Category);
网上澳门金莎娱乐 6
网上澳门金莎娱乐 7DataSet productDataSet = db.ExecuteDataSet(dbCommand);

而用了新的DBCommand类之后则变成了:

网上澳门金莎娱乐 8Database db = DatabaseFactory.CreateDatabase();
网上澳门金莎娱乐 9
网上澳门金莎娱乐 10DbCommand dbCommand = db.GetStoredProcCommand("GetProductsByCategory"); 
网上澳门金莎娱乐 11
网上澳门金莎娱乐 12db.AddInParameter(dbCommand, "CategoryID", DbType.Int32, Category);
网上澳门金莎娱乐 13
网上澳门金莎娱乐 14DataSet productDataSet = db.ExecuteDataSet(dbCommand);

数据库连接字符串在我们基于数据库的开发永远是少不了的,但是在DAAB1.1下,它所使用的字符串跟我们在.NET类库中使用的连接字符串却是不能共享的,它们分别保存在不同的位置。而在2.0的Data Access Application Block使用了ADO.NET2.0里面<connectionStrings>配置区,这样带来的一个好处是连接字符串可以在Application Block和自定义的.NET类之间共享使用该配置区,如:

网上澳门金莎娱乐 15<connectionStrings>
网上澳门金莎娱乐 16        <add
网上澳门金莎娱乐 17            name="DataAccessQuickStart" 
网上澳门金莎娱乐 18            providerName="System.Data.SqlClient"
网上澳门金莎娱乐 19            connectionString="server=(local)SQLEXPRESS;database=EntLibQuickStarts;Integrated Security=true" />
网上澳门金莎娱乐 20</connectionStrings>

在.NET2.0下,泛型编程已经成为了一个核心,而2.0版的DAAB中也新增了一个GenericDatabase对象。DAAB中虽然已经包含了SqlDatabase和OrcaleDatabase,但是如果我们需要使用其他的像DB2等数据库时,就需要用到GenericDatabase,它可以用于任何.NET类库中的数据提供者,包括OdbcProvider和OleDbProvider。

二.使用示例

DAAB2.0的配置非常简单,主要有以下几方面的配置:

配置连接字符串

网上澳门金莎娱乐 21

配置默认数据库

网上澳门金莎娱乐 22

添加相关的命名空间:

网上澳门金莎娱乐 23using Microsoft.Practices.EnterpriseLibrary.Data;
网上澳门金莎娱乐 24using System.Data;

使用Data Access Application Block进行数据的读取和操作,一般分为三步:

 1.创建Database对象

2.提供命令参数,如果需要的话

3.执行命令

下面分别看一下DataAccessQuickStart中提供的一些例子:

执行静态的SQL语句

网上澳门金莎娱乐 25public string GetCustomerList()
网上澳门金莎娱乐 26网上澳门金莎娱乐 27网上澳门金莎娱乐 28{
网上澳门金莎娱乐 29// 创建Database对象
网上澳门金莎娱乐 30Database db = DatabaseFactory.CreateDatabase();
网上澳门金莎娱乐 31// 使用SQL语句创建DbCommand对象
网上澳门金莎娱乐 32string sqlCommand = "Select CustomerID, Name, Address, City, Country, PostalCode " +
网上澳门金莎娱乐 33    "From Customers";
网上澳门金莎娱乐 34DbCommand dbCommand = db.GetSqlStringCommand(sqlCommand);
网上澳门金莎娱乐 35
网上澳门金莎娱乐 36StringBuilder readerData = new StringBuilder();
网上澳门金莎娱乐 37
网上澳门金莎娱乐 38// 调用ExecuteReader方法
网上澳门金莎娱乐 39using (IDataReader dataReader = db.ExecuteReader(dbCommand))
网上澳门金莎娱乐 40网上澳门金莎娱乐 41网上澳门金莎娱乐 42{
网上澳门金莎娱乐 43    while (dataReader.Read())
网上澳门金莎娱乐 44网上澳门金莎娱乐 45    网上澳门金莎娱乐 46{
网上澳门金莎娱乐 47        // Get the value of the 'Name' column in the DataReader
网上澳门金莎娱乐 48        readerData.Append(dataReader["Name"]);
网上澳门金莎娱乐 49        readerData.Append(Environment.NewLine);
网上澳门金莎娱乐 50    }
网上澳门金莎娱乐 51}
网上澳门金莎娱乐 52
网上澳门金莎娱乐 53return readerData.ToString();
网上澳门金莎娱乐 54}

执行存储过程并传递参数,返回DataSet

网上澳门金莎娱乐 55public DataSet GetProductsInCategory(int Category)
网上澳门金莎娱乐 56网上澳门金莎娱乐 57网上澳门金莎娱乐 58{
网上澳门金莎娱乐 59    // Create the Database object, using the default database service. The
网上澳门金莎娱乐 60    // default database service is determined through configuration.
网上澳门金莎娱乐 61    Database db = DatabaseFactory.CreateDatabase();
网上澳门金莎娱乐 62
网上澳门金莎娱乐 63    string sqlCommand = "GetProductsByCategory";
网上澳门金莎娱乐 64    DbCommand dbCommand = db.GetStoredProcCommand(sqlCommand);
网上澳门金莎娱乐 65
网上澳门金莎娱乐 66    // Retrieve products from the specified category.
网上澳门金莎娱乐 67    db.AddInParameter(dbCommand, "CategoryID", DbType.Int32, Category);
网上澳门金莎娱乐 68
网上澳门金莎娱乐 69    // DataSet that will hold the returned results        
网上澳门金莎娱乐 70    DataSet productsDataSet = null;
网上澳门金莎娱乐 71
网上澳门金莎娱乐 72    productsDataSet = db.ExecuteDataSet(dbCommand);
网上澳门金莎娱乐 73
网上澳门金莎娱乐 74    // Note: connection was closed by ExecuteDataSet method call 
网上澳门金莎娱乐 75
网上澳门金莎娱乐 76    return productsDataSet;
网上澳门金莎娱乐 77}

利用DataSet更新数据

网上澳门金莎娱乐 78public int UpdateProducts()
网上澳门金莎娱乐 79网上澳门金莎娱乐 80网上澳门金莎娱乐 81{
网上澳门金莎娱乐 82    // Create the Database object, using the default database service. The
网上澳门金莎娱乐 83    // default database service is determined through configuration.
网上澳门金莎娱乐 84    Database db = DatabaseFactory.CreateDatabase();
网上澳门金莎娱乐 85
网上澳门金莎娱乐 86    DataSet productsDataSet = new DataSet();
网上澳门金莎娱乐 87
网上澳门金莎娱乐 88    string sqlCommand = "Select ProductID, ProductName, CategoryID, UnitPrice, LastUpdate " +
网上澳门金莎娱乐 89        "From Products";
网上澳门金莎娱乐 90    DbCommand dbCommand = db.GetSqlStringCommand(sqlCommand);
网上澳门金莎娱乐 91
网上澳门金莎娱乐 92    string productsTable = "Products";
网上澳门金莎娱乐 93
网上澳门金莎娱乐 94    // Retrieve the initial data
网上澳门金莎娱乐 95    db.LoadDataSet(dbCommand, productsDataSet, productsTable);
网上澳门金莎娱乐 96
网上澳门金莎娱乐 97    // Get the table that will be modified
网上澳门金莎娱乐 98    DataTable table = productsDataSet.Tables[productsTable];
网上澳门金莎娱乐 99
网上澳门金莎娱乐 100    // Add a new product to existing DataSet
网上澳门金莎娱乐 101网上澳门金莎娱乐 102    DataRow addedRow = table.Rows.Add(new object[] 网上澳门金莎娱乐 103{DBNull.Value, "New product", 11, 25});
网上澳门金莎娱乐 104
网上澳门金莎娱乐 105    // Modify an existing product
网上澳门金莎娱乐 106    table.Rows[0]["ProductName"] = "Modified product";
网上澳门金莎娱乐 107
网上澳门金莎娱乐 108    // Establish our Insert, Delete, and Update commands
网上澳门金莎娱乐 109    DbCommand insertCommand = db.GetStoredProcCommand("AddProduct");
网上澳门金莎娱乐 110    db.AddInParameter(insertCommand, "ProductName", DbType.String, "ProductName", DataRowVersion.Current);
网上澳门金莎娱乐 111    db.AddInParameter(insertCommand, "CategoryID", DbType.Int32, "CategoryID", DataRowVersion.Current);
网上澳门金莎娱乐 112    db.AddInParameter(insertCommand, "UnitPrice", DbType.Currency, "UnitPrice", DataRowVersion.Current);
网上澳门金莎娱乐 113
网上澳门金莎娱乐 114    DbCommand deleteCommand = db.GetStoredProcCommand("DeleteProduct");
网上澳门金莎娱乐 115    db.AddInParameter(deleteCommand, "ProductID", DbType.Int32, "ProductID", DataRowVersion.Current);
网上澳门金莎娱乐 116
网上澳门金莎娱乐 117    DbCommand updateCommand = db.GetStoredProcCommand("UpdateProduct");
网上澳门金莎娱乐 118    db.AddInParameter(updateCommand, "ProductID", DbType.Int32, "ProductID", DataRowVersion.Current);
网上澳门金莎娱乐 119    db.AddInParameter(updateCommand, "ProductName", DbType.String, "ProductName", DataRowVersion.Current);
网上澳门金莎娱乐 120    db.AddInParameter(updateCommand, "LastUpdate", DbType.DateTime, "LastUpdate", DataRowVersion.Current);
网上澳门金莎娱乐 121
网上澳门金莎娱乐 122    // Submit the DataSet, capturing the number of rows that were affected
网上澳门金莎娱乐 123    int rowsAffected = db.UpdateDataSet(productsDataSet, "Products", insertCommand, updateCommand,
网上澳门金莎娱乐 124                                        deleteCommand, UpdateBehavior.Standard);
网上澳门金莎娱乐 125
网上澳门金莎娱乐 126    return rowsAffected;
网上澳门金莎娱乐 127
网上澳门金莎娱乐 128}

通过ID获取记录详细信息

网上澳门金莎娱乐 129public string GetProductDetails(int productID)
网上澳门金莎娱乐 130网上澳门金莎娱乐 131网上澳门金莎娱乐 132{
网上澳门金莎娱乐 133    // Create the Database object, using the default database service. The
网上澳门金莎娱乐 134    // default database service is determined through configuration.
网上澳门金莎娱乐 135    Database db = DatabaseFactory.CreateDatabase();
网上澳门金莎娱乐 136
网上澳门金莎娱乐 137    string sqlCommand = "GetProductDetails";
网上澳门金莎娱乐 138    DbCommand dbCommand = db.GetStoredProcCommand(sqlCommand);
网上澳门金莎娱乐 139
网上澳门金莎娱乐 140    // Add paramters
网上澳门金莎娱乐 141    // Input parameters can specify the input value
网上澳门金莎娱乐 142    db.AddInParameter(dbCommand, "ProductID", DbType.Int32, productID);
网上澳门金莎娱乐 143    // Output parameters specify the size of the return data
网上澳门金莎娱乐 144    db.AddOutParameter(dbCommand, "ProductName", DbType.String, 50);
网上澳门金莎娱乐 145    db.AddOutParameter(dbCommand, "UnitPrice", DbType.Currency, 8);
网上澳门金莎娱乐 146
网上澳门金莎娱乐 147    db.ExecuteNonQuery(dbCommand);
网上澳门金莎娱乐 148
网上澳门金莎娱乐 149    // Row of data is captured via output parameters
网上澳门金莎娱乐 150    string results = string.Format(CultureInfo.CurrentCulture, "{0}, {1}, {2:C} ",
网上澳门金莎娱乐 151                                   db.GetParameterValue(dbCommand, "ProductID"),
网上澳门金莎娱乐 152                                   db.GetParameterValue(dbCommand, "ProductName"),
网上澳门金莎娱乐 153                                   db.GetParameterValue(dbCommand, "UnitPrice"));
网上澳门金莎娱乐 154
网上澳门金莎娱乐 155    return results;
网上澳门金莎娱乐 156}

以XML格式返回数据

网上澳门金莎娱乐 157public string GetProductList()
网上澳门金莎娱乐 158网上澳门金莎娱乐 159网上澳门金莎娱乐 160{
网上澳门金莎娱乐 161    // Use a named database instance that refers to a SQL Server database.
网上澳门金莎娱乐 162    SqlDatabase dbSQL = DatabaseFactory.CreateDatabase() as SqlDatabase;
网上澳门金莎娱乐 163
网上澳门金莎娱乐 164    // Use "FOR XML AUTO" to have SQL return XML data
网上澳门金莎娱乐 165    string sqlCommand = "Select ProductID, ProductName, CategoryID, UnitPrice, LastUpdate " +
网上澳门金莎娱乐 166        "From Products FOR XML AUTO";
网上澳门金莎娱乐 167    DbCommand dbCommand = dbSQL.GetSqlStringCommand(sqlCommand);
网上澳门金莎娱乐 168
网上澳门金莎娱乐 169    XmlReader productsReader = null;
网上澳门金莎娱乐 170    StringBuilder productList = new StringBuilder();
网上澳门金莎娱乐 171
网上澳门金莎娱乐 172    try
网上澳门金莎娱乐 173网上澳门金莎娱乐 174    网上澳门金莎娱乐 175{
网上澳门金莎娱乐 176        productsReader = dbSQL.ExecuteXmlReader(dbCommand);
网上澳门金莎娱乐 177
网上澳门金莎娱乐 178        // Iterate through the XmlReader and put the data into our results.
网上澳门金莎娱乐 179        while (!productsReader.EOF)
网上澳门金莎娱乐 180网上澳门金莎娱乐 181        网上澳门金莎娱乐 182{
网上澳门金莎娱乐 183            if (productsReader.IsStartElement())
网上澳门金莎娱乐 184网上澳门金莎娱乐 185            网上澳门金莎娱乐 186{
网上澳门金莎娱乐 187                productList.Append(productsReader.ReadOuterXml());
网上澳门金莎娱乐 188                productList.Append(Environment.NewLine);
网上澳门金莎娱乐 189            }
网上澳门金莎娱乐 190        }
网上澳门金莎娱乐 191    }
网上澳门金莎娱乐 192    finally
网上澳门金莎娱乐 193网上澳门金莎娱乐 194    网上澳门金莎娱乐 195{
网上澳门金莎娱乐 196      // Close the Reader.
网上澳门金莎娱乐 197      if (productsReader != null)
网上澳门金莎娱乐 198网上澳门金莎娱乐 199      网上澳门金莎娱乐 200{
网上澳门金莎娱乐 201          productsReader.Close();
网上澳门金莎娱乐 202      }
网上澳门金莎娱乐 203      
网上澳门金莎娱乐 204      // Explicitly close the connection. The connection is not closed
网上澳门金莎娱乐 205      // when the XmlReader is closed.
网上澳门金莎娱乐 206      if (dbCommand.Connection != null)
网上澳门金莎娱乐 207网上澳门金莎娱乐 208      网上澳门金莎娱乐 209{
网上澳门金莎娱乐 210        dbCommand.Connection.Close();
网上澳门金莎娱乐 211      }  
网上澳门金莎娱乐 212    }
网上澳门金莎娱乐 213
网上澳门金莎娱乐 214    return productList.ToString();
网上澳门金莎娱乐 215}

使用事务

网上澳门金莎娱乐 216public bool Transfer(int transactionAmount, int sourceAccount, int destinationAccount)
网上澳门金莎娱乐 217网上澳门金莎娱乐 218网上澳门金莎娱乐 219{
网上澳门金莎娱乐 220    bool result = false;
网上澳门金莎娱乐 221    
网上澳门金莎娱乐 222    // Create the Database object, using the default database service. The
网上澳门金莎娱乐 223    // default database service is determined through configuration.
网上澳门金莎娱乐 224    Database db = DatabaseFactory.CreateDatabase();
网上澳门金莎娱乐 225
网上澳门金莎娱乐 226    // Two operations, one to credit an account, and one to debit another
网上澳门金莎娱乐 227    // account.
网上澳门金莎娱乐 228网上澳门金莎娱乐,    string sqlCommand = "CreditAccount";
网上澳门金莎娱乐 229    DbCommand creditCommand = db.GetStoredProcCommand(sqlCommand);
网上澳门金莎娱乐 230
网上澳门金莎娱乐 231    db.AddInParameter(creditCommand, "AccountID", DbType.Int32, sourceAccount);
网上澳门金莎娱乐 232    db.AddInParameter(creditCommand, "Amount", DbType.Int32, transactionAmount);
网上澳门金莎娱乐 233
网上澳门金莎娱乐 234    sqlCommand = "DebitAccount";
网上澳门金莎娱乐 235    DbCommand debitCommand = db.GetStoredProcCommand(sqlCommand);
网上澳门金莎娱乐 236
网上澳门金莎娱乐 237    db.AddInParameter(debitCommand, "AccountID", DbType.Int32, destinationAccount);
网上澳门金莎娱乐 238    db.AddInParameter(debitCommand, "Amount", DbType.Int32, transactionAmount);
网上澳门金莎娱乐 239
网上澳门金莎娱乐 240    using (DbConnection connection = db.CreateConnection())
网上澳门金莎娱乐 241网上澳门金莎娱乐 242    网上澳门金莎娱乐 243{
网上澳门金莎娱乐 244        connection.Open();
网上澳门金莎娱乐 245        DbTransaction transaction = connection.BeginTransaction();
网上澳门金莎娱乐 246
网上澳门金莎娱乐 247        try
网上澳门金莎娱乐 248网上澳门金莎娱乐 249        网上澳门金莎娱乐 250{
网上澳门金莎娱乐 251            // Credit the first account
网上澳门金莎娱乐 252            db.ExecuteNonQuery(creditCommand, transaction);
网上澳门金莎娱乐 253            // Debit the second account
网上澳门金莎娱乐 254            db.ExecuteNonQuery(debitCommand, transaction);
网上澳门金莎娱乐 255
网上澳门金莎娱乐 256            // Commit the transaction
网上澳门金莎娱乐 257            transaction.Commit();
网上澳门金莎娱乐 258            
网上澳门金莎娱乐 259            result = true;
网上澳门金莎娱乐 260        }
网上澳门金莎娱乐 261        catch
网上澳门金莎娱乐 262网上澳门金莎娱乐 263        网上澳门金莎娱乐 264{
网上澳门金莎娱乐 265            // Rollback transaction 
网上澳门金莎娱乐 266            transaction.Rollback();
网上澳门金莎娱乐 267        }
网上澳门金莎娱乐 268        connection.Close();
网上澳门金莎娱乐 269        
网上澳门金莎娱乐 270        return result;
网上澳门金莎娱乐 271    }
网上澳门金莎娱乐 272}

三.常见功能

本文由网上澳门金莎娱乐发布于数据库,转载请注明出处:网上澳门金莎娱乐:Enterprise Library2.0数据库常用操作

关键词: