如何使用 Visual C++.NET 或 Visual C++ 2005年更新 DataSet 物件從一個資料庫

文章翻譯 文章翻譯
文章編號: 815660 - 檢視此文章適用的產品。
全部展開 | 全部摺疊

在此頁中

結論

本文將逐步告訴您如何取得包含資料 (這從資料庫載入) 資料集、 如何修改該資料以及然後如何傳送回資料庫更新原始來源。

資料集 物件在 Microsoft.NET Framework 中的資料存取的重要部分是資料表、 檢視表和關聯性可保留的記憶體中物件。

需求

下列清單列出建議的硬體、 軟體、 網路基礎結構及您需要的服務套件:
  • 下列其中一項: Microsoft Windows 2000 專業版、 Microsoft Windows 2000 Server、 Microsoft Windows 2000 進階伺服器或 Microsoft Windows NT 4.0 伺服器
  • 下列其中一項: Microsoft SQL Server 7.0 版,Microsoft SQL Server 2000 或 Microsoft 資料引擎 (MSDE) 與 PUBS 範例資料庫與適當的權限、 使用者識別碼和密碼值安裝。
  • Microsoft Visual Studio.NET 或 Microsoft Visual Studio 2005
本文假設您已熟悉下列主題:
  • 資料庫術語
  • 結構化的查詢語言 (SQL)


如何更新 DataSet 物件從一個資料庫

本節會示範如何使用 DataSet 物件來更新資料庫中的資料。

重要您也可以使用一個 SqlCommand 物件來插入、 更新,和直接刪除資料庫中的資料。

載入 資料集 之後您可以修改資料。資料集 將會追蹤這些變更。資料集 物件可以視為從資料庫擷取的資料的系統記憶體中快取。DataSet 物件所組成的資料表、 關聯性和條件約束的集合。

更新 資料集,並將這些更新傳送回至資料庫,請依照下列步驟執行:
  1. 開啟 Microsoft Visual Studio.NET 或 Microsoft Visual Studio 2005。
  2. 在 Visual C++.NET 中建立新的 受管理的 C + + 應用程式。Visual Studio 會建立 main () 函式。移除 main () 函式中的任何產生的程式碼。
  3. 若要加入至 系統System.Data 命名空間參考,加入下列程式碼
    #using <System.Dll>
    #using <System.Data.Dll>
    #using <System.Xml.Dll>
  4. 如此一來您不需要限定這些命名空間在稍後的程式碼中的宣告,請使用 系統System.DataSystem.Data.SqlClient 命名空間上的 使用 陳述式。您必須使用這些陳述式,在任何其他宣告之前。
    using namespace System;
    using namespace System::Data;
    using namespace System::Xml;
    using namespace System::Data::SqlClient;
    
  5. 您可以修改資料並送出將變更傳回資料庫之前,資訊必須載入 資料集

    下列程式碼中的連接字串會指向位於本機電腦 (或執行程式碼的電腦) 的 SQL Server。這個字串取代您自己的設定。

    若要彙總,建立連接,然後資料配接器時,並建立,這用來填入資料的 資料集
    SqlConnection  *objConn;
    String *sConnectionString;
    sConnectionString = "Password=StrongPassword;User ID=UserName;Initial Catalog=pubs;Data Source=(local)";
    
    objConn = new SqlConnection(sConnectionString);
    objConn->Open();
            
    // Create an instance of a DataAdapter.
    SqlDataAdapter* daAuthors = new SqlDataAdapter("Select * From Authors", objConn);
    
    // Create an instance of a DataSet, and retrieve data from the Authors table.
    DataSet* dsPubs = new DataSet("Pubs");
    daAuthors->FillSchema(dsPubs,SchemaType::Source, "Authors");
    daAuthors->Fill(dsPubs,"Authors");
    
    附註 您必須加入通用語言執行階段支援編譯器選項 (/ clr:oldSyntax) 來順利編譯先前的程式碼範例的 Visual C++ 2005年中。 若要在 Visual C++ 2005年中加入常用的語言執行階段支援編譯器選項,請依照下列步驟執行:
    1. 按一下 [專案,] 然後按一下 [<ProjectName> 屬性

      附註<ProjectName> 是專案的名稱的預留位置。
    2. 展開 [組態屬性,] 然後按一下 [一般
    3. 按一下以選取 通用語言執行階段支援、 舊語法 (/ clr:oldSyntax)通用語言執行階段支援 的專案設定中在右窗格中,按一下 套用,],然後再按一下 [確定]
    如需有關通用語言執行階段支援編譯器選項,請造訪下列 Microsoft 網站:
    / clr (通用語言執行階段編譯)
    http://msdn2.microsoft.com/en-us/library/k8d11d4s.aspx
    這些步驟套用到整個發行項。
  6. 既然載入資料,您可以修改它。有許多種方式可以新增資料列 (或記錄)。這個程式碼範例使用了三個步驟的程序:
    1. DataTable 取得新的 DataRow 物件。
    2. DataRow 欄位值設定為必要。
    3. 將新的物件傳遞至 DataTable.Rows 集合的 Add 方法。

    在步驟 5 中程式碼之後貼上下列的程式碼:
    // BEGIN ADD CODE 
    // Create a new instance of a DataTable.
    DataTable* tblAuthors = dsPubs->Tables->Item["Authors"];
    
    
    // Obtain a new DataRow object from the DataTable.
    DataRow* drCurrent = tblAuthors->NewRow();
    
    // Set the DataRow field values as necessary.
    drCurrent->set_Item("au_id",new String("993-21-3427"));
    
    drCurrent->set_Item("au_fname",new String("George"));
    drCurrent->set_Item("au_lname",new String("Johnson"));
    drCurrent->set_Item("phone",new String("800 226-0752"));
    drCurrent->set_Item("address", new String ("1956 Arlington Pl."));
    drCurrent->set_Item("city", new String("Winnipeg"));
    drCurrent->set_Item("state", new String("MB"));
    drCurrent->set_Item("contract",__box(1));
    
    // Pass that new object into the Add method of the DataTable.
    tblAuthors->Rows->Add(drCurrent);
    Console::WriteLine("Add was successful, Click any key to continue!!");
    Console::ReadLine();
    
    // END ADD CODE  
    
  7. 若要編輯現有的資料列,取得適當的 DataRow 物件,然後再為一或多個資料行提供新值。您必須先找到正確資料列是更加容易,因為載入的結構描述資料表和資料 (呼叫 FillSchema 在步驟 5)。使用就地結構描述,資料表知道哪一個資料行是它的主索引鍵並 Find 方法的 Rows 集合可供使用。

    尋找 方法會傳回 DataRow 物件具有特定的值 (在此情況下,au_id) 其主索引鍵中。有 DataRow 了之後, 您可以修改資料行。沒有換行 BeginEditEndEdit 中, 所做的修改,但這簡化了工時 資料集 必須執行,並可讓呼叫 EndEdit 時同時執行其驗證檢查的 資料集

    在步驟 6 中的程式碼之後貼上下列程式碼:
    // BEGIN EDIT CODE 
    
    drCurrent = tblAuthors->Rows->Find(new String("213-46-8915"));
    drCurrent->BeginEdit();
    
    drCurrent->set_Item("phone",String::Concat(S"342",(static_cast<String *>(drCurrent->Item["phone"]))->Substring(3)));
    drCurrent->EndEdit ();
    Console::WriteLine("Record edited successfully, Click any key to continue!!");
    Console::ReadLine();
    
    // END EDIT CODE
    
  8. 若要使用所有的變更更新原始資料庫,可至 資料配接器 物件的 [更新] 方法傳遞 資料集

    然而,呼叫 Update 前您必須設定 資料配接器 物件的 InsertCommandUpdateCommandDeleteCommand 屬性。您以手動方式可以寫入 SQL 並填入與對應的 SqlCommand 物件這三個屬性但是您也可以使用 Visual Studio.NET 自動產生這些三個命令。

    若要產生必要的命令,在需要時,您必須建立 SqlCommandBuilder 物件的執行個體,並在建構函式中使用 資料配接器。如果想使用這個方法 (如後面的程式碼範例所示),您必須有主索引鍵資訊可用為您的資料表。若要存取主索引鍵資訊,呼叫 FillSchema,,然後將您的資料配接器的 MissingSchemaAction 屬性設定為 AddWithKey,或是以手動方式在您的程式碼中設定主索引鍵。

    在步驟 7.
    // BEGIN SEND CHANGES TO SQL SERVER 
    
    SqlCommandBuilder* objCommandBuilder = new SqlCommandBuilder(daAuthors);
    daAuthors->Update(dsPubs, "Authors");
    Console::WriteLine("SQL Server updated successfully, Check Server explorer to see changes");
    Console::ReadLine();
    
    // END SEND CHANGES TO SQL SERVER 
    
  9. 若要完全刪除資料列,使用 Delete 方法的 DataRow 物件。

    附註Rows 集合包含 移除 以及 RemoveAt,哪些似乎刪除資料列,但改只是從集合移除資料列的兩個方法。只有 [刪除] 方法會將您刪除傳送回來源資料庫。

    在步驟 8 中程式碼之後貼上下列的程式碼:
    //BEGIN DELETE CODE 
    
    drCurrent = tblAuthors->Rows->Find(new String("993-21-3427"));
    drCurrent->Delete();
    Console::WriteLine("Record deleted successfully, Click any key to continue!!"); 
    Console::ReadLine();
    
    //END DELETE CODE  
    
  10. 變更傳送到 SQL Server,以移除先前加入的記錄。

    在步驟 9 中程式碼之後貼上下列的程式碼:
    // CLEAN UP SQL SERVER
    daAuthors->Update(dsPubs, "Authors");
    Console::WriteLine("SQL Server updated successfully, Check Server explorer to see changes");
    Console::ReadLine();
    objConn->Close ();
    
  11. 儲存您的專案。
  12. 在 [偵錯] 功能表上按一下 [開始] 執行專案]。

    請注意,數個訊息方塊出現,指出程式碼的進度,並可讓您檢閱程式碼隨著資料的目前狀態。


完成程式碼清單

// This is the main project file for VC++ application project 
// generated using an Application Wizard.

#include "stdafx.h"

#using <mscorlib.dll>
#using <System.Dll>
#using <System.Data.Dll>
#using <System.Xml.dll>
#include <tchar.h>

using namespace System;
using namespace System::Xml;
using namespace System::Data;
using namespace System::Data::SqlClient;

// This is the entry point for this application
int _tmain(void)
{
    SqlConnection  *objConn;
    try
    {
        String *sConnectionString;
        sConnectionString = "Password=StrongPassword;User ID=UserName;Initial Catalog=pubs;Data Source=(local)";

        objConn = new SqlConnection(sConnectionString);
        objConn->Open();
        
        // Create an instance of a DataAdapter.
        SqlDataAdapter* daAuthors = new SqlDataAdapter("Select * From Authors", objConn);

        // Create an instance of a DataSet, and retrieve data from the Authors table.
        DataSet* dsPubs = new DataSet("Pubs");
        daAuthors->FillSchema(dsPubs,SchemaType::Source, "Authors");
        daAuthors->Fill(dsPubs,"Authors");

        // BEGIN ADD CODE 
        // Create a new instance of a DataTable.
        DataTable* tblAuthors = dsPubs->Tables->Item["Authors"];


        // Obtain a new DataRow object from the DataTable.
        DataRow* drCurrent = tblAuthors->NewRow();

        // Set the DataRow field values as necessary.
        drCurrent->set_Item("au_id",new String("993-21-3427"));

        drCurrent->set_Item("au_fname",new String("George"));
        drCurrent->set_Item("au_lname",new String("Johnson"));
        drCurrent->set_Item("phone",new String("800 226-0752"));
        drCurrent->set_Item("address", new String ("1956 Arlington Pl."));
        drCurrent->set_Item("city", new String("Winnipeg"));
        drCurrent->set_Item("state", new String("MB"));
        drCurrent->set_Item("contract",__box(1));

        // Pass that new object into the Add method of the DataTable.
        tblAuthors->Rows->Add(drCurrent);
        Console::WriteLine("Add was successful, Click any key to continue!!");
        Console::ReadLine();

        // END ADD CODE  
        
        // BEGIN EDIT CODE 

        drCurrent = tblAuthors->Rows->Find(new String("213-46-8915"));
        drCurrent->BeginEdit();

        drCurrent->set_Item("phone",String::Concat(S"342",(static_cast<String *>(drCurrent->Item["phone"]))->Substring(3)));
        drCurrent->EndEdit ();
        Console::WriteLine("Record edited successfully, Click any key to continue!!");
        Console::ReadLine();

        // END EDIT CODE

        // BEGIN SEND CHANGES TO SQL SERVER 

        SqlCommandBuilder* objCommandBuilder = new SqlCommandBuilder(daAuthors);
        daAuthors->Update(dsPubs, "Authors");
        Console::WriteLine("SQL Server updated successfully, Check Server explorer to see changes");
        Console::ReadLine();

        // END SEND CHANGES TO SQL SERVER 

        //BEGIN DELETE CODE 

        drCurrent = tblAuthors->Rows->Find(new String("993-21-3427"));
        drCurrent->Delete();
        Console::WriteLine("SRecord deleted successfully, Click any key to continue!!"); 
        Console::ReadLine();

        //END DELETE CODE  


        // CLEAN UP SQL SERVER
        daAuthors->Update(dsPubs, "Authors");
        Console::WriteLine("SQL Server updated successfully, Check Server explorer to see changes");
        Console::ReadLine();
    }
    catch (Exception* ex)
    {
        Console::WriteLine (ex->Message );
    }
    __finally
    {
        objConn->Close ();
    }
}


?考

如需有關使用 ADO.NET 的詳細資訊,DataSet 物件] 和 [SQL],請造訪下列 Microsoft 網站:

屬性

文章編號: 815660 - 上次校閱: 2007年3月19日 - 版次: 5.2
這篇文章中的資訊適用於:
  • Microsoft Visual C++ 2005 Express Edition
  • Microsoft Visual C++ .NET 2002 Standard Edition
關鍵字:?
kbmt kbsystemdata kbsqlclient kbhowtomaster kbhowto KB815660 KbMtzh
機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。
按一下這裡查看此文章的英文版本:815660
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。

提供意見

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com