• <fieldset id="8imwq"><menu id="8imwq"></menu></fieldset>
  • <bdo id="8imwq"><input id="8imwq"></input></bdo>
    最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
    問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
    當前位置: 首頁 - 科技 - 知識百科 - 正文

    如何將數據導入到SQLServerCompactEdition數據庫中(三)

    來源:懂視網 責編:小采 時間:2020-11-09 15:45:13
    文檔

    如何將數據導入到SQLServerCompactEdition數據庫中(三)

    如何將數據導入到SQLServerCompactEdition數據庫中(三):系列文章導航: 如何將數據導入到 SQL Server Compact Edition 數據庫中(一) 如何將數據導入到 SQL Server Compact Edition 數據庫中(二) 摘要:時隔近半年了,不知道大家是否還記得,我在本系列的第一篇文章的總結中提到,創建 SQL Server
    推薦度:
    導讀如何將數據導入到SQLServerCompactEdition數據庫中(三):系列文章導航: 如何將數據導入到 SQL Server Compact Edition 數據庫中(一) 如何將數據導入到 SQL Server Compact Edition 數據庫中(二) 摘要:時隔近半年了,不知道大家是否還記得,我在本系列的第一篇文章的總結中提到,創建 SQL Server

    系列文章導航: 如何將數據導入到 SQL Server Compact Edition 數據庫中(一) 如何將數據導入到 SQL Server Compact Edition 數據庫中(二) 摘要:時隔近半年了,不知道大家是否還記得,我在本系列的第一篇文章的總結中提到,創建 SQL Server CE 數據庫表

    系列文章導航:
    如何將數據導入到 SQL Server Compact Edition 數據庫中(一)
    如何將數據導入到 SQL Server Compact Edition 數據庫中(二)

    摘要:時隔近半年了,不知道大家是否還記得,我在本系列的第一篇文章的總結中提到,創建 SQL Server CE 數據庫表結構的 SQL 語句是可以自動生成的。那么本系列的第三篇文章就向大家介紹一種比較簡單的方法。

    ADO.NET 中的 IDataReader.GetSchemaTable 方法可以返回一個 DataTable,它描述了 IDataReader 查詢結果中各列的元數據。列的元數據包含了列的名稱、數據類型、大小、是否為主鍵字段、是否為自動增長字段……等等。有了這些元數據,我們就可以通過編寫幾段 C#/VB.NET 代碼,實現創建 SQL Server CE 數據庫表結構的 SQL 語句的自動生成。以下方法是生成創建表 SQL 語句的主要代碼:

    ///


    /// 生成創建數據庫表結構的 SQL 語句。
    ///

    private static string GenerateTableSchemaSql(IDbConnection connection, string queryString)
    {
    StringBuilder tableSql = new StringBuilder();

    IDbCommand command = connection.CreateCommand();
    command.CommandText = queryString;

    try
    {
    /* 獲取查詢結果各列的元數據 */
    DataTable schemaTable = null;
    using (IDataReader reader = command.ExecuteReader(CommandBehavior.KeyInfo))
    {
    schemaTable = reader.GetSchemaTable();
    }

    /* 生成創建表定義語句 */
    string tableName = schemaTable.Rows[0]["BaseTableName"].ToString();
    tableSql.Append("CREATE TABLE [").Append(tableName).AppendLine("] (");

    /* 生成各列的定義語句 */
    string columnName;
    string allowDBNull;
    DataRow row;
    bool hasKey = false;
    StringBuilder sbPKFields = new StringBuilder();
    for (int i = 0; i < schemaTable.Rows.Count; i++)
    {
    if (i != 0) tableSql.AppendLine(",");

    row = schemaTable.Rows[i];
    columnName = (string)row["ColumnName"];
    allowDBNull = ((bool)row["AllowDBNull"] == true ? "NULL" : "NOT NULL");

    if ((bool)row["IsKey"])
    {
    sbPKFields.AppendFormat("[{0}],", columnName);
    hasKey = true;
    }
    tableSql.AppendFormat(" [{0}] {1} {2}", columnName, GetSqlCeDataType(row), allowDBNull);
    }

    /* 生成主鍵約束語句 */
    if (hasKey)
    {
    string pkFields = sbPKFields.ToString().TrimEnd(',');
    tableSql.AppendLine(",");
    tableSql.Append(" CONSTRAINT PK_").Append(tableName.Replace(" ", "_")).Append(" PRIMARY KEY(").Append(pkFields).AppendLine(")");
    }
    tableSql.AppendLine(");");
    }
    catch (Exception ex)
    {
    Debug.WriteLine(ex);
    }

    return tableSql.ToString();
    }

    同樣的,該方法也使用了 ADO.NET 的接口類,不依賴于具體的數據庫類型。該方法的核心就是通過 IDataReader.GetSchemaTable 方法獲取查詢結果各列元數據,相關代碼如下:

    IDbCommand command = connection.CreateCommand();
    command.CommandText = queryString;
    DataTable schemaTable = null;
    using (IDataReader reader = command.ExecuteReader(CommandBehavior.KeyInfo))
    {
    schemaTable = reader.GetSchemaTable();
    }

    首先,IDbCommand 的 CommandText 屬性一般是針對一個表的 SELECT 查詢語句,如:SELECT * FROM Customers。其次,IDbCommand.ExecuteReader 方法必須傳入 CommandBehavior.KeyInfo 參數,這樣才能獲取到列的主鍵元數據。最后,通過 IDataReader.GetSchemaTable 方法返回一個包含查詢結果所有列的元數據的 DataTable。關于 IDataReader.GetSchemaTable 方法的詳細使用說明,請閱讀《HOW TO:使用 DataReader GetSchemaTable 方法和 Visual C# .NET 檢索列架構》

    IDataReader.GetSchemaTable 返回的 SchemaTable 對列數據類型的描述是用相應的 .NET 數據類型,如 SQL Server CE 的 int 類型對應的是 .NET 的 System.Int32 類型。另外需要注意的是,由于 Windows Mobile 只支持 Unicode 編碼,因此 SQL Server CE 只支持 NChar, NVarChar 和 NText 等 Unicode 字符數據類型,而不支持 Char, VarChar 和 Text 等非 Unicode 字符數據類型。所以,我們需要編寫一個方法,它根據列的 .NET 數據類型找到對應的 SQL Server CE 數據類型。這個方法的代碼如下所示:

    ///


    /// 從 .NET 數據類型獲取對應的 SQL Server CE 類型名稱。
    ///

    private static string GetSqlCeNativeType(Type systemType)
    {
    string typeName = systemType.ToString();
    switch (typeName)
    {
    case "System.Boolean":
    return "bit";
    case "System.Byte":
    return "tinyint";
    case "System.Byte[]":
    return "image";
    case "System.DateTime":
    return "datetime";
    case "System.Decimal":
    return "numeric";
    case "System.Double":
    return "float";
    case "System.Guid":
    return "uniqueidentifier";
    case "System.Int16":
    return "smallint";
    case "System.Int32":
    return "integer";
    case "System.Int64":
    return "bigint";
    case "System.Single":
    return "real";
    case "System.String":
    return "nvarchar";
    default:
    throw new ApplicationException(string.Format("找不到 {0} 類型對應的 SQL Server CE 數據類型。", typeName));
    }
    }

    當然,僅僅知道列的數據類型還不夠,我們需要為某些列的數據類型加上長度、精度或小數位數等列大小信息。可以通過下面的方法實現:

    ///


    /// 從 ColumnSchemaRow 獲取 SQL Server CE 數據類型。
    ///

    private static string GetSqlCeDataType(DataRow columnSchemaRow)
    {
    Type type = columnSchemaRow["DataType"] as Type;
    string dataType = GetSqlCeNativeType(type);
    switch (dataType)
    {
    case "numeric":
    Int16 precision = (Int16)columnSchemaRow["NumericPrecision"];
    Int16 scale = (Int16)columnSchemaRow["NumericScale"];
    Int32 colsize = (Int32)columnSchemaRow["ColumnSize"];
    if (precision != 0 && scale != 0 && scale != 255)
    {
    dataType = string.Format("{0}({1},{2})", dataType, precision, scale);
    }
    else if (scale == 255 && colsize == 8)
    {
    dataType = "money";
    }
    break;
    case "nvarchar":
    int columnSize = (int)columnSchemaRow["ColumnSize"];
    if (columnSize > 4000)
    {
    dataType = "ntext";
    }
    else
    {
    dataType = string.Format("{0}({1})", dataType, columnSize);
    }
    break;
    }
    return dataType;
    }

    關于 SQL Server 2005 Compact Edition 數據類型的描述,詳細請參考聯機叢書。使用上面的幾段代碼,對 SQL Server 2000 自帶的 Northwind 數據庫的 Customers 表生成創建數據庫表的 SQL 語句,生成結果如下:

    CREATE TABLE [Customers] (
    [CustomerID] nvarchar(5) NOT NULL,
    [CompanyName] nvarchar(40) NOT NULL,
    [ContactName] nvarchar(30) NULL,
    [ContactTitle] nvarchar(30) NULL,
    [Address] nvarchar(60) NULL,
    [City] nvarchar(15) NULL,
    [Region] nvarchar(15) NULL,
    [PostalCode] nvarchar(10) NULL,
    [Country] nvarchar(15) NULL,
    [Phone] nvarchar(24) NULL,
    [Fax] nvarchar(24) NULL,
    CONSTRAINT PK_Customers PRIMARY KEY([CustomerID])
    );

    對于 SQL Server 2000,我們可以從信息架構視圖查詢 INFORMATION_SCHEMA.TABLES 出數據庫有哪些表,并一次性對所有表進行生成。以下是 INFORMATION_SCHEMA.TABLES 視圖各列的說明:

    列名 數據類型 說明
    TABLE_CATALOG nvarchar(128) 表限定符。
    TABLE_SCHEMA nvarchar(128) 包含該表的架構的名稱。
    TABLE_NAME sysname 表名。
    TABLE_TYPE varchar(10) 表的類型。可以是 VIEW 或 BASE TABLE。

    我們可以通過以下方法獲得 Northwind 數據庫所有用戶表名的數組:

    ///


    /// 從一個打開的 SQL Server 數據庫連接獲取數據庫的表名數組。
    ///

    private static string[] GetTableNames(IDbConnection connection)
    {
    IDbCommand command = connection.CreateCommand();

    // 從 SQL Server 信息架構視圖獲取 Northwind 數據庫所有表的名稱
    command.CommandText = @"SELECT * FROM INFORMATION_SCHEMA.TABLES
    WHERE TABLE_TYPE='BASE TABLE' AND TABLE_CATALOG='Northwind'";

    List tableNames = new List();
    using (IDataReader reader = command.ExecuteReader())
    {
    while (reader.Read())
    {
    tableNames.Add(reader["TABLE_NAME"].ToString());
    }
    }
    return tableNames.ToArray();
    }

    有了 GetTableNames 方法,我們就可以一次性對 Northwind 數據庫的所有用戶表生成相應的創建 SQL Server CE 數據庫表結構的 SQL 語句。

    static void Main(string[] args)
    {
    string connectionString = "Data Source=(local);Initial Catalog=Northwind;Integrated Security=True";
    IDbConnection connection = new SqlConnection(connectionString);
    connection.Open();

    string[] tableNames = GetTableNames(connection);

    string queryString, createTableSql;
    foreach (string tableName in tableNames)
    {
    queryString = string.Format("select * from [{0}]", tableName);
    createTableSql = GenerateTableSchemaSql(connection, queryString);

    Console.WriteLine(createTableSql);
    Debug.WriteLine(createTableSql);
    }

    connection.Close();
    Console.Read();
    }

    示例程序運行效果如下圖所示:

    總結:閱讀完本文,相信你已經了解了如何利用 ADO.NET 的 IDataReader.GetSchemaTable 方法獲得服務器端數據庫表的元數據,并用于生成對應的創建 SQL Server CE 數據庫表的 SQL 語句。本系列文章可能還會有更精彩的續篇,我會將平時積累的關于 SQL Server CE 數據導入的一些經驗充實到本系列中。

    示例代碼下載:sqlce_data_import3.rar

    更新記錄:
    2008-2-9 修正對money數據類型的支持,修正對包含空格的表名的支持。

    作者:黎波
    博客:http://upto.cnblogs.com/
    日期:2008年1月31日

    聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

    文檔

    如何將數據導入到SQLServerCompactEdition數據庫中(三)

    如何將數據導入到SQLServerCompactEdition數據庫中(三):系列文章導航: 如何將數據導入到 SQL Server Compact Edition 數據庫中(一) 如何將數據導入到 SQL Server Compact Edition 數據庫中(二) 摘要:時隔近半年了,不知道大家是否還記得,我在本系列的第一篇文章的總結中提到,創建 SQL Server
    推薦度:
    標簽: 數據 導入 如何
    • 熱門焦點

    最新推薦

    猜你喜歡

    熱門推薦

    專題
    Top
    主站蜘蛛池模板: 爽爽精品dvd蜜桃成熟时电影院| 熟女精品视频一区二区三区| 精品视频一区二区三区四区五区| 无码日韩人妻精品久久蜜桃 | 国产成人精品优优av| 久久久精品日本一区二区三区| 999精品在线| 漂亮人妻被黑人久久精品| 久久精品亚洲乱码伦伦中文| 亚洲国产精品国自产电影| heyzo高无码国产精品| 人人妻人人澡人人爽人人精品电影| 国精品无码A区一区二区| 欧美+亚洲+精品+三区| 国产精品无码午夜福利| 最新国产成人精品2024| 欧美精品亚洲人成在线观看| 国产福利电影一区二区三区,亚洲国模精品一区 | 国产韩国精品一区二区三区久久| 亚洲欧美国产精品第1页| 国语自产精品视频| 91精品国产品国语在线不卡| 精品亚洲欧美高清不卡高清| 国产精品熟女高潮视频| 久久精品国产亚洲av日韩| 亚洲精品无码久久千人斩| 婷婷国产成人精品一区二| 精品人妻系列无码人妻免费视频| 亚洲国产综合精品中文第一区| 国产精品三级在线| 国产福利91精品一区二区| 91在线视频精品| 国99精品无码一区二区三区| 精品国产三级a∨在线| 精品无码AV无码免费专区| 精品无码无人网站免费视频| 人妻少妇乱子伦精品| 日韩精品无码免费一区二区三区| 国产精品1024香蕉在线观看| 免费国产在线精品一区| 精品露脸国产偷人在视频|