給個例子給你看下:
...
_CommandPtr
m_cmdptr;
m_cmdptr.CreateInstance(__uuidof(
Command
)
);
_ParameterPtr
inParam2=NULL;
_ParameterPtr
inParam3=NULL;
_ParameterPtr
inParam4=NULL;
_ParameterPtr
outParam1=NULL;
_ParameterPtr
outParam2=NULL;
_ParameterPtr
outParam3=NULL;
inParam2.CreateInstance(__uuidof(Parameter));
inParam3.CreateInstance(__uuidof(Parameter));
inParam4.CreateInstance(__uuidof(Parameter));
outParam1.CreateInstance(__uuidof(Parameter));
outParam2.CreateInstance(__uuidof(Parameter));
outParam3.CreateInstance(__uuidof(Parameter));
m_cmdptr->ActiveConnection=m_pConnection;
m_cmdptr->CommandType=adCmdStoredProc;
m_cmdptr->CommandText=_bstr_t("proc_XXX");//存儲過程的名稱
//輸入參數
inParam2=m_cmdptr->CreateParameter(_bstr_t("@P1"),adVarChar,adParamInput,32,_bstr_t(P1));
m_cmdptr->Parameters->Append(inParam2);
inParam3=m_cmdptr->CreateParameter(_bstr_t("@P2"),adVarChar,adParamInput,20,_bstr_t(P2));
m_cmdptr->Parameters->Append(inParam3);
//輸出參數
outParam1=m_cmdptr->CreateParameter("@P4",adInteger,adParamOutput,sizeof(int));
m_cmdptr->Parameters->Append(outParam1);
outParam2=m_cmdptr->CreateParameter("@P5",adInteger,adParamOutput,sizeof(int));
m_cmdptr->Parameters->Append(outParam2);
outParam3=m_cmdptr->CreateParameter(_bstr_t("@P6"),adVarChar,adParamOutput,20,_bstr_t(P6));
m_cmdptr->Parameters->Append(outParam3);
//執行
m_cmdptr->Execute(NULL,NULL,adCmdStoredProc);
//取返回值
long
p1=m_cmdptr->Parameters->GetItem("@P4")->Value;
long
p2=m_cmdptr->Parameters->GetItem("@P5")->Value;
VARIANT
vtP6
=m_cmdptr->Parameters->GetItem("@P6")->Value;
if
(vtP6.vt
!=
VT_NULL)
strcpy(tp,(_bstr_t)vtP6);
m_cmdptr.Detach;
⑵ 關於存儲過程中連接資料庫問題
存儲過程的概念
sql Server提供了一種方法,它可以將一些固定的操作集中起來由SQL Server資料庫伺服器來完成,以實現某個任務,這種方法就是存儲過程。
存儲過程是SQL語句和可選控制流語句的預編譯集合,存儲在資料庫中,可由應用程序通過一個調用執行,而且允許用戶聲明變數、有條件執行以及其他強大的編程功能。
在SQL Server中存儲過程分為兩類:即系統提供的存儲過程和用戶自定義的存儲過程。
可以出於任何使用SQL語句的目的來使用存儲過程,它具有以下優點:
可以在單個存儲過程中執行一系列SQL語句。
可以從自己的存儲過程內引用其他存儲過程,這可以簡化一系列復雜語句。
存儲過程在創建時即在伺服器上進行編譯,所以執行起來比單個SQL語句快,而且減少網路通信的負擔。
安全性更高。
創建存儲過程
在SQL Server中,可以使用三種方法創建存儲過程 :
①使用創建存儲過程向導創建存儲過程。
②利用SQL Server 企業管理器創建存儲過程。
③使用Transact-SQL語句中的CREATE PROCEDURE命令創建存儲過程。
下面介紹使用Transact-SQL語句中的CREATE PROCEDURE命令創建存儲過程
創建存儲過程前,應該考慮下列幾個事項:
①不能將 CREATE PROCEDURE 語句與其它 SQL 語句組合到單個批處理中。
②存儲過程可以嵌套使用,嵌套的最大深度不能超過32層。
③創建存儲過程的許可權默認屬於資料庫所有者,該所有者可將此許可權授予其他用戶。
④存儲過程是資料庫對象,其名稱必須遵守標識符規則。
⑤只能在當前資料庫中創建存儲過程。
⑥ 一個存儲過程的最大尺寸為128M。
使用CREATE PROCEDURE創建存儲過程的語法形式如下:
QUOTE:
CREATE PROC[EDURE]procere_name[;number][;number]
[{@parameter data_type}[VARYING][=default][OUTPUT]][,...n]
WITH
{RECOMPILE|ENCRYPTION|RECOMPILE,ENCRYPTION}]
[FOR REPLICATION]
AS sql_statement [ ...n ]
用CREATE PROCEDURE創建存儲過程的語法參數的意義如下:
procere_name:用於指定要創建的存儲過程的名稱。
number:該參數是可選的整數,它用來對同名的存儲過程分組,以便用一條 DROP PROCEDURE 語句即可將同組的過程一起除去。
@parameter:過程中的參數。在 CREATE PROCEDURE 語句中可以聲明一個或多個參數。
data_type:用於指定參數的數據類型。
VARYING:用於指定作為輸出OUTPUT參數支持的結果集。
Default:用於指定參數的默認值。
OUTPUT:表明該參數是一個返回參數。
例如:下面創建一個 簡單的存儲過程proctinfo,用於檢索產品信息。
USE Northwind
if exists(select name from sysobjects
where name='proctinfo' and type = 'p')
drop procere proctinfo
GO
create procere proctinfo
as
select * from procts
GO
通過下述sql語句執行該存儲過程:execute proctinfo
即可檢索到產品信息。
執行存儲過程
直接執行存儲過程可以使用EXECUTE命令來執行,其語法形式如下:
[[EXEC[UTE]]
{ [@return_status=]
{procere_name[;number]|@procere_name_var} [[@parameter=]{value|@variable[OUTPUT]|[DEFAULT]}
[,...n]
[ WITH RECOMPILE ]
使用 EXECUTE 命令傳遞單個參數,它執行 showind 存儲過程,以 titles 為參數值。showind 存儲過程需要參數 (@tabname),它是一個表的名稱。其程序清單如下:
EXEC showind titles
當然,在執行過程中變數可以顯式命名:
EXEC showind @tabname = titles
如果這是 isql 腳本或批處理中第一個語句,則 EXEC 語句可以省略:
showind titles或者showind @tabname = titles
下面的例子使用了默認參數
USE Northwind
GO
CREATE PROCEDURE insert_Procts_1
( @SupplierID_2 int,
@CategoryID_3 int,
@ProctName_1 nvarchar(40)='無')
AS INSERT INTO Procts
(ProctName,SupplierID,CategoryID)
VALUES
(@ProctName_1,@SupplierID_2,@CategoryID_3)
GO
exec insert_Procts_1 1,1
Select * from Procts where SupplierID=1 and CategoryID=1
GO
下面的例子使用了返回參數
USE Northwind
GO
CREATE PROCEDURE query_procts
( @SupplierID_1 int,
@ProctName_2 nvarchar(40) output)
AS
select @ProctName_2 = ProctName from procts
where SupplierID = @SupplierID_1
執行該存儲過程來查詢SupplierID為1的產品名:
declare @proct nvarchar(40)
exec query_procts 1,@proct output
select '產品名'= @proct
go
查看存儲過程
存儲過程被創建之後,它的名字就存儲在系統表sysobjects中,它的源代碼存放在系統表syscomments中。可以使用使用企業管理器或系統存儲過程來查看用戶創建的存儲過程。
使用企業管理器查看用戶創建的存儲過程
在企業管理器中,打開指定的伺服器和資料庫項,選擇要創建存儲過程的資料庫,單擊存儲過程文件夾,此時在右邊的頁框中顯示該資料庫的所有存儲過程。用右鍵單擊要查看的存儲過程,從彈出的快捷菜單中選擇屬性選項,此時便可以看到存儲過程的源代碼。
使用系統存儲過程來查看用戶創建的存儲過程
可供使用的系統存儲過程及其語法形式如下:
sp_help:用於顯示存儲過程的參數及其數據類型
sp_help [[@objname=] name]
參數name為要查看的存儲過程的名稱。
sp_helptext:用於顯示存儲過程的源代碼
sp_helptext [[@objname=] name]
參數name為要查看的存儲過程的名稱。
sp_depends:用於顯示和存儲過程相關的資料庫對象
sp_depends [@objname=]』object』
參數object為要查看依賴關系的存儲過程的名稱。
sp_stored_proceres:用於返回當前資料庫中的存儲過程列表
修改存儲過程
存儲過程可以根據用戶的要求或者基表定義的改變而改變。使用ALTER PROCEDURE語句可以更改先前通過執行 CREATE PROCEDURE 語句創建的過程,但不會更改許可權,也不影響相關的存儲過程或觸發器。其語法形式如下:
ALTERPROC[EDURE]procere_name[;number]
[{@parameterdata_type}
[VARYING][=default][OUTPUT]][,...n] [WITH
{RECOMPILE|ENCRYPTION|RECOMPILE,ENCRYPTION}]
[FOR REPLICATION]
AS
sql_statement [ ...n ]
重命名和刪除存儲過程
1. 重命名存儲過程
修改存儲過程的名稱可以使用系統存儲過程sp_rename,其語法形式如下:
sp_rename 原存儲過程名稱,新存儲過程名稱
另外,通過企業管理器也可以修改存儲過程的名稱。
刪除存儲過程
刪除存儲過程可以使用DROP命令,DROP命令可以將一個或者多個存儲過程或者存儲過程組從當前資料庫中刪除,其語法形式如下:
drop procere {procere} [,…n]
當然,利用企業管理器也可以很方便地刪除存儲過程。
存儲過程的重新編譯
在我們使用了一次存儲過程後,可能會因為某些原因,必須向表中新增加數據列或者為表新添加索引,從而改變了資料庫的邏輯結構。這時,需要對存儲過程進行重新編譯,SQL Server提供三種重新編譯存儲過程的方法 :
1、在建立存儲過程時設定重新編譯
語法格式:CREATE PROCEDURE procere_name WITH RECOMPILE AS sql_statement
2、在執行存儲過程時設定重編譯
語法格式: EXECUTE procere_name WITH RECOMPILE
3、通過使用系統存儲過程設定重編譯
語法格式為: EXEC sp_recompile OBJECT
系統存儲過程與擴展存儲過程
1.系統存儲過程
系統存儲過程存儲在master資料庫中,並以sp_為前綴,主要用來從系統表中獲取信息,為系統管理員管理SQL Server提供幫助,為用戶查看資料庫對象提供方便。比如用來查看資料庫對象信息的系統存儲過程sp_help、顯示存儲過程和其它對象的文本的存儲過程sp_helptext等。
2.擴展存儲過程:
擴展存儲過程以xp_為前綴,它是關系資料庫引擎的開放式數據服務層的一部分,其可以使用戶在動態鏈接庫(DLL)文件所包含的函數中實現邏輯,從而擴展了Transact-SQL的功能,並且可以象調用Transact-SQL過程那樣從Transact-SQL語句調用這些函數。
例: 利用擴展存儲過程xp_cmdshell為一個操作系統外殼執行指定命令串,並作為文本返回任何輸出。
執行代碼:
use master
exec xp_cmdshell 'dir *.exe'
執行結果返回系統目錄下的文件內容文本信息。
最後給大家舉一個例子:
QUOTE:
/**
1、 在Northwind資料庫中,創建一個帶查詢參數的存儲過程,
要求在輸入一個定購金額總額@total時,查詢超出該值的所
有產品的相關信息,包括產品名稱和供應商名稱、單位數量、
單價、以及該產品的定購金額總額,並通過一個輸出參數返回
滿足查詢條件的產品數
**/
IF exists (select * from SysObjects where name='more_than_total' and type='p')
drop procere more_than_total
go
CREATE PROCEDURE More_Than_Total
@total money = 0
AS
Declare @amount smallint
BEGIN
select distinct
P.proctName,
S.contactName,
P.UnitPrice
from Procts P inner join [order Details] O
on p.proctID=o.proctID inner join suppliers s
on p.supplierID=s.SupplierID
where O.proctID in
(select proctID
from [order Details]
group by proctId
having sum(quantity*unitprice)>@total
)
END
GO
⑶ 用c語言怎麼實現與資料庫的連接
#include<mysql/mysql.h>
#include<stdio.h>
intmain()
{
MYSQL*conn;
MYSQL_RES*res;
MYSQL_ROWrow;
char*server="localhost";//本地連接
char*user="root";//
char*password="525215980";//mysql密碼
char*database="student";//資料庫名
char*query="select*fromclass";//需要查詢的語句
intt,r;
conn=mysql_init(NULL);
if(!mysql_real_connect(conn,server,user,password,database,0,NULL,0))
{
printf("Errorconnectingtodatabase:%s ",mysql_error(conn));
}else{
printf("Connected... ");
}
t=mysql_query(conn,query);
if(t)
{
printf("Errormakingquery:%s ",mysql_error(conn));
}else{
printf("Querymade... ");
res=mysql_use_result(conn);
if(res)
{
while((row=mysql_fetch_row(res))!=NULL)
{
//printf("num=%d ",mysql_num_fields(res));//列數
for(t=0;t<mysql_num_fields(res);t++)
printf("%8s",row[t]);
printf(" ");
}
}
mysql_free_result(res);
}
mysql_close(conn);
return0;
}
(3)c和存儲過程怎麼連接資料庫擴展閱讀
C語言使用注意事項:
1、指針是c語言的靈魂,一定要靈活的使用它:
(1)、指針的聲明,創建,賦值,銷毀等
(2)、指針的類型轉換,傳參,回調等
2、遞歸調用也會經常用到:
(1)、遞歸遍歷樹結構
(2)、遞歸搜索
⑷ 怎樣使c#和存儲過程連接將數據添加到資料庫
你的意思是用c#調用存儲過程了吧!
public static int ExecuteInsertStoreProcere(SqlParameter[] param,string storeName)
{
int result = 0;
using (SqlConnection con = getConnection())
{
con.Open();
SqlCommand cmd = new SqlCommand(storeName,con);
cmd.CommandType = CommandType.StoredProcere;
foreach(SqlParameter parm in param)
{
cmd.Parameters.Add(parm);
}
result=cmd.ExecuteNonQuery();
con.Close();
}
return result;
}
⑸ vc++與資料庫連接的簡單問題
可以用 ADO 連接資料庫,下面是轉自於VC知識庫網站的文檔。
ADO(Active Data Object,活動數據對象)實際上是一種基於COM(組件對象模型)的自動化介面(IDispatch)技術,並以OLE DB(對象連接和鑲入的資料庫)為基礎,經過OLE DB精心包裝後的資料庫訪問技術,利用它可以快速的創建資料庫應用程序。 ADO提供了一組非常簡單,將一般通用的數據訪問細節進行封裝的對象。由於ODBC數據源也提供了一般的OLE DB Privider,所以ADO不僅可以應用自身的OLE DB Privider,而且還可以應用所有的ODBC驅動程序。關於OLE DB和ADO的其它詳細情況,讀者可以自行查閱相關書籍或MSDN,這里就不一一說明了。讓我們直接步入主題:如何掌握ADO這種資料庫訪問技術。ADO的操作方法和前面講過的DAO的操作在很多方面存在相似之處,在這里,筆者為了更有效的說明它的使用方法,用VC6.0做了一個示常式序——AdoRWAccess,這個示常式序可以直接通過ADO來操作Access資料庫,示常式序的運行效果如下圖所示:
在示常式序中我們仍採用原庫結構,資料庫名Demo.mdb,庫內表名DemoTable,表內欄位名為Name(姓名)和Age(年齡)的兩個欄位,來構造示常式序操作所需的Access資料庫,這也和上兩篇文章的示例源碼中的庫結構相兼容。
下面讓我們看看ADO資料庫訪問技術使用的基本步驟及方法:
首先,要用#import語句來引用支持ADO的組件類型庫(*.tlb),其中類型庫可以作為可執行程序(DLL、EXE等)的一部分被定位在其自身程序中的附屬資源里,如:被定位在msado15.dll的附屬資源中,只需要直接用#import引用它既可。可以直接在Stdafx.h文件中加入下面語句來實現:
#import "c:\program files\common files\system\ado\msado15.dll" \
no_namespace \
rename ("EOF", "adoEOF")
其中路徑名可以根據自己系統安裝的ADO支持文件的路徑來自行設定。當編譯器遇到#import語句時,它會為引用組件類型庫中的介面生成包裝類,#import語句實際上相當於執行了API涵數LoadTypeLib()。#import語句會在工程可執行程序輸出目錄中產生兩個文件,分別為*.tlh(類型庫頭文件)及*.tli(類型庫實現文件),它們分別為每一個介面產生智能指針,並為各種介面方法、枚舉類型,CLSID等進行聲明,創建一系列包裝方法。語句no_namespace說明ADO對象不使用命名空間,rename ("EOF", "adoEOF")說明將ADO中結束標志EOF改為adoEOF,以避免和其它庫中命名相沖突。
其次,在程序初始過程中需要初始化組件,一般可以用CoInitialize(NULL);來實現,這種方法在結束時要關閉初始化的COM,可以用下面語句CoUnInitialize();來實現。在MFC中還可以採用另一種方法來實現初始化COM,這種方法只需要一條語句便可以自動為我們實現初始化COM和結束時關閉COM的操作,語句如下所示: AfxOleInit();
接著,就可以直接使用ADO的操作了。我們經常使用的只是前面用#import語句引用類型庫時,生成的包裝類.tlh中聲明的智能指針中的三個,它們分別是_ConnectionPtr、_RecordsetPtr和_CommandPtr。下面分別對它們的使用方法進行介紹:
1、_ConnectionPtr智能指針,通常用於打開、關閉一個庫連接或用它的Execute方法來執行一個不返回結果的命令語句(用法和_CommandPtr中的Execute方法類似)。
——打開一個庫連接。先創建一個實例指針,再用Open打開一個庫連接,它將返回一個IUnknown的自動化介面指針。代碼如下所示: _ConnectionPtr m_pConnection;
// 初始化COM,創建ADO連接等操作
AfxOleInit();
m_pConnection.CreateInstance(__uuidof(Connection));
// 在ADO操作中建議語句中要常用try...catch()來捕獲錯誤信息,
// 因為它有時會經常出現一些意想不到的錯誤。jingzhou xu
try
{
// 打開本地Access庫Demo.mdb
m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Demo.mdb","","",adModeUnknown);
}
catch(_com_error e)
{
AfxMessageBox("資料庫連接失敗,確認資料庫Demo.mdb是否在當前路徑下!");
return FALSE;
}
——關閉一個庫連接。如果連接狀態有效,則用Close方法關閉它並賦於它空值。代碼如下所示: if(m_pConnection->State)
m_pConnection->Close();
m_pConnection= NULL;
2、_RecordsetPtr智能指針,可以用來打開庫內數據表,並可以對表內的記錄、欄位等進行各種操作。
——打開數據表。打開庫內表名為DemoTable的數據表,代碼如下: _RecordsetPtr m_pRecordset;
m_pRecordset.CreateInstance(__uuidof(Recordset));
// 在ADO操作中建議語句中要常用try...catch()來捕獲錯誤信息,
// 因為它有時會經常出現一些意想不到的錯誤。jingzhou xu
try
{
m_pRecordset->Open("SELECT * FROM DemoTable", // 查詢DemoTable表中所有欄位
theApp.m_pConnection.GetInterfacePtr(), // 獲取庫接庫的IDispatch指針
adOpenDynamic,
adLockOptimistic,
adCmdText);
}
catch(_com_error *e)
{
AfxMessageBox(e->ErrorMessage());
}
——讀取表內數據。將表內數據全部讀出並顯示在列表框內,m_AccessList為列表框的成員變數名。如果沒有遇到表結束標志adoEOF,則用GetCollect(欄位名)或m_pRecordset->Fields->GetItem(欄位名)->Value方法,來獲取當前記錄指針所指的欄位值,然後再用MoveNext()方法移動到下一條記錄位置。代碼如下所示: _variant_t var;
CString strName,strAge;
try
{
if(!m_pRecordset->BOF)
m_pRecordset->MoveFirst();
else
{
AfxMessageBox("表內數據為空");
return;
}
// 讀入庫中各欄位並加入列表框中
while(!m_pRecordset->adoEOF)
{
var = m_pRecordset->GetCollect("Name");
if(var.vt != VT_NULL)
strName = (LPCSTR)_bstr_t(var);
var = m_pRecordset->GetCollect("Age");
if(var.vt != VT_NULL)
strAge = (LPCSTR)_bstr_t(var);
m_AccessList.AddString( strName + " --> "+strAge );
m_pRecordset->MoveNext();
}
// 默認列表指向第一項,同時移動記錄指針並顯示
m_AccessList.SetCurSel(0);
}
catch(_com_error *e)
{
AfxMessageBox(e->ErrorMessage());
}
——插入記錄。可以先用AddNew()方法新增一個空記錄,再用PutCollect(欄位名,值)輸入每個欄位的值,最後再Update()更新到庫中數據既可。其中變數m_Name和m_Age分別為姓名及年齡編輯框的成員變數名。代碼所下所示: try
{
// 寫入各欄位值
m_pRecordset->AddNew();
m_pRecordset->PutCollect("Name", _variant_t(m_Name));
m_pRecordset->PutCollect("Age", atol(m_Age));
m_pRecordset->Update();
AfxMessageBox("插入成功!");
}
catch(_com_error *e)
{
AfxMessageBox(e->ErrorMessage());
}
——移動記錄指針。移動記錄指針可以通過MoveFirst()方法移動到第一條記錄、MoveLast()方法移動到最後一條記錄、MovePrevious()方法移動到當前記錄的前一條記錄、MoveNext()方法移動到當前記錄的下一條記錄。但我們有時經常需要隨意移動記錄指針到任意記錄位置時,可以使用Move(記錄號)方法來實現,注意: Move()方法是相對於當前記錄來移動指針位置的,正值向後移動、負值向前移動,如:Move(3),當前記錄是3時,它將從記錄3開始往後再移動3條記錄位置。代碼如下所示: try
{
int curSel = m_AccessList.GetCurSel();
// 先將指針移向第一條記錄,然後就可以相對第一條記錄來隨意移動記錄指針
m_pRecordset->MoveFirst();
m_pRecordset->Move(long(curSel));
}
catch(_com_error *e)
{
AfxMessageBox(e->ErrorMessage());
}
——修改記錄中欄位值。可以將記錄指針移動到要修改記錄的位置處,直接用PutCollect(欄位名,值)將新值寫入並Update()更新資料庫既可。可以用上面方法移動記錄指針,修改欄位值代碼如下所示: try
{
// 假設對第二條記錄進行修改
m_pRecordset->MoveFirst();
m_pRecordset->Move(1); // 從0開始
m_pRecordset->PutCollect("Name", _variant_t(m_Name));
m_pRecordset->PutCollect("Age", atol(m_Age));
m_pRecordset->Update();
}
catch(_com_error *e)
{
AfxMessageBox(e->ErrorMessage());
}
——刪除記錄。刪除記錄和上面修改記錄的操作類似,先將記錄指針移動到要修改記錄的位置,直接用Delete()方法刪除它並用Update()來更新資料庫既可。代碼如下所示: try
{
// 假設刪除第二條記錄
m_pRecordset->MoveFirst();
m_pRecordset->Move(1); // 從0開始
m_pRecordset->Delete(adAffectCurrent); // 參數adAffectCurrent為刪除當前記錄
m_pRecordset->Update();
}
catch(_com_error *e)
{
AfxMessageBox(e->ErrorMessage());
}
——關閉記錄集。直接用Close方法關閉記錄集並賦於其空值。代碼如下所示: m_pRecordset->Close();
m_pRecordset = NULL;
3、CommandPtr智能指針,可以使用_ConnectionPtr或_RecordsetPtr來執行任務,定義輸出參數,執行存儲過程或SQL語句。
——執行SQL語句。先創建一個_CommandPtr實例指針,再將庫連接和SQL語句做為參數,執行Execute()方法既可。代碼如下所示: _CommandPtr m_pCommand;
m_pCommand.CreateInstance(__uuidof(Command));
m_pCommand->ActiveConnection = m_pConnection; // 將庫連接賦於它
m_pCommand->CommandText = "SELECT * FROM DemoTable"; // SQL語句
m_pRecordset = m_pCommand->Execute(NULL, NULL,adCmdText); // 執行SQL語句,返回記錄集
——執行存儲過程。執行存儲過程的操作和上面執行SQL語句類似,不同點僅是CommandText參數中不再是SQL語句,而是存儲過程的名字,如Demo。另一個不同點就是在Execute()中參數由adCmdText(執行SQL語句),改為adCmdStoredProc來執行存儲過程。如果存儲過程中存在輸入、輸出參數的話,需要使用到另一個智能指針_ParameterPtr來逐次設置要輸入、輸出的參數信息,並將其賦於_CommandPtr中Parameters參數來傳遞信息,有興趣的讀者可以自行查找相關書籍或MSDN。執行存儲過程的代碼如下所示: _CommandPtr m_pCommand;
m_pCommand.CreateInstance(__uuidof(Command));
m_pCommand->ActiveConnection = m_pConnection; // 將庫連接賦於它
m_pCommand->CommandText = "Demo";
m_pCommand->Execute(NULL,NULL, adCmdStoredProc);
⑹ 如何進行C#連接Access資料庫的細節操作
許多學者總會面對於資料庫的知識,以下的例子講述到Access資料庫說明,用C#的DataSet類訪問資料庫的一些操作方法。
操作涉及的主要C#類有:
DataSet:對應資料庫表的一個集合,實際上是資料庫表在內存中的一個緩存
DataTable:對應資料庫表,是資料庫錶行的集合
DataRow:對應資料庫錶行
OleDbConnection:建立資料庫連接
OleDbDataAdapter:由資料庫生成DataSet,並負責DataSet與資料庫的同步
OleDbCommandBuilder:生成更新資料庫所需的指令www.kmxxfk.com
DataSet、DataTable、DataRow用於數據在緩存中的操作,這上面的操作只有更新到資料庫中,修改結果才會被永久保存。OleDbConnection 是用OLEDB方法連接資料庫所必需的。OleDbDataAdapter和OleDbCommandBuilder用來生成DataSet,完成資料庫更新。與OleDbDataAdapter和OleDbCommandBuilder相對應,SqlDataAdapter和SqlCommandBuilder也可以完成用SQL語言為指令的資料庫更新。
假設在D:盤創建了Access資料庫,其路徑為d:\0DBAcs\account.mdb,資料庫中有一張名為kai的資料庫表。表結構如下:
表名;Kai
欄位Field Name類型說明
1開支IDkzID長整型自動編號
2開支人Kzren文本50字元
3開支項目名kzname文本50字元
4日期riqi日期/時間99-99-99;0掩碼
5開支說明shuoming文本225字元
6總金額zonge單精度小數點任意;這項開支的總花費
7數量shuliang長整型www.kmxxfc.com
8單價Danjia單精度小數點任意
表建好之後:(1)對表中添加新數據(2)查詢表中的某個欄位。為了實現這兩項功能,以下幾個問題要考慮:
1准備工作
聲明必須的公共變數
建立與資料庫的連接,創建DataSet對象
2添加記錄
在DataSet對象上添加記錄
同步DataSet對象對象與資料庫中的數據,這一點很重要,很多人忘記了數據進行同步,結果往往是添加、修改的數據不能保存到資料庫中。
3查詢資料庫表中某記錄的某欄位;
我們可以將上述功能用一個類DataOper實現,下面是程序設計的主要活動。
聲明要用的C#系統類
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Data;
using System.Data.OleDb;
using System.Data.SqlClient;
聲明DataOper類中的公共變數
private string DBlocation;
private OleDbConnection dbconn; //資料庫連接
private OleDbDataAdapter da;
建立與資料庫的連接,這里採用了OLEDB方法:
dbconn = new OleDbConnection(@"provider=microsoft.jet.oledb.4.0; Data Source=d:\0DBAcs\account.mdb");
dbconn.Open();
創建DataSet對象
da = new OleDbDataAdapter(@"select * from kai", dbconn); //引用資料庫連接dbconn並依據SQL語句"select * from kai"創建OleDbDataAdapter對象da
DataSet ds = new DataSet(); //創建DataSet對象
da.Fill(ds); //用OleDbDataAdapter對象da填充、更新剛創建的DataSet對象
添加記錄並更新資料庫
OleDbCommandBuilder cb = new OleDbCommandBuilder(da); // 創建OleDbCommandBuilder對象cb用於更新OleDbDataAdapter對象da的Insert、Delete、Update指令
da.UpdateCommand = cb.GetUpdateCommand(); //更新OleDbDataAdapter對象da的指令
設計人員可以編寫自己的更新指令,也可以象上面所寫的那樣用系統默認的指令。但不管怎樣,上面的語句不能缺少,否則程序在運行中會拋出異常System.InvalidOperationException,並提示:Update requires a valid InsertCommand when passed DataRow collection with new rows.
DataRow drx = ds.Tables[0].NewRow(); //創建一條新記錄行
drx["kzren"] = "kzren";
drx["kzname"]="kzname";
drx["riqi"]=2008-10-11;
drx["shuoming"]="shuoming";
drx["zonge"] = 12;
drx["shuliang"] = 3;
drx["danjia"] = 4;
ds.Tables[0].Rows.Add(drx); //在表中追加記錄
da.Update(ds); //更新資料庫
要查詢引用某記錄的某欄位,直接按如下的方法引用就可以了。
String kx=ds.Tables[0].Rows[0]["kzren"].ToString()連接access
首先看一個例子代碼片斷:
程序代碼:www.lzfsk.com/
--------------------------------------------------------------------------------
using system.data;
using system.data.oledb;
......
string strconnection="provider=microsoft.jet.oledb.4.0;";
strconnection+=@"data source=c:\begas.Net\northwind.mdb";
oledbconnection objconnection=new oledbconnection(strconnection);
......
objconnection.open();
objconnection.close();
......
--------------------------------------------------------------------------------
解釋:
連接access資料庫需要導入額外的命名空間,所以有了最前面的兩條using命令,這是必不可少的!
strconnection這個變數里存放的是連接資料庫所需要的連接字元串,他指定了要使用的數據提供者和要使用的數據源.
"provider=microsoft.jet.oledb.4.0;"是指數據提供者,這里使用的是microsoft jet引擎,也就是access中的數據引擎,ASP.net就是靠這個和access的資料庫連接的.
"data source=c:\begaspnet\northwind.mdb"是指明數據源的位置,他的標准形式是"data source=mydrive:mypath\myfile.mdb".
ps:
1."+="後面的"@"符號是防止將後面字元串中的"\"解析為轉義字元.
2.如果要連接的資料庫文件和當前文件在同一個目錄下,還可以使用如下的方法連接:
strconnection+="data source=";
strconnection+=mappath("northwind.mdb");
這樣就可以省得你寫一大堆東西了!
3.要注意連接字元串中的參數之間要用分號來分隔.
"oledbconnection objconnection=new oledbconnection(strconnection);"這一句是利用定義好的連接字元串來建立了一個鏈接對象,以後對資料庫的操作我們都要和這個對象打交道.
"objconnection.open();"這用來打開連接.至此,與access資料庫的連接完成.其餘操作(插入,刪除...)請參閱相關書籍
連接SQL Server
例子代碼片斷:
程序代碼:
--------------------------------------------------------------------------------
using system.data;
using system.data.sqlclient;
...
string strconnection="user id=sa;passWord=;";
strconnection+="initial catalog=northwind;server=yoursqlserver;";
strconnection+="connect timeout=30";
sqlconnection objconnection=new sqlconnection(strconnection);
...
objconnection.open();
objconnection.close();
...
--------------------------------------------------------------------------------
解釋:
連接sql server資料庫的機制與連接access的機制沒有什麼太大的區別,只是改變了connection對象和連接字元串中的不同參數.
首先,連接sql server使用的命名空間不是"system.data.oledb",而是"system.data.sqlclient".
其次就是他的連接字元串了,我們一個一個參數來介紹(注意:參數間用分號分隔):
"user id=sa":連接資料庫的驗證用戶名為sa.他還有一個別名"uid",所以這句我們還可以寫成"uid=sa".
"password=":連接資料庫的驗證密碼為空.他的別名為"pwd",所以我們可以寫為"pwd=".
這里注意,你的sql server必須已經設置了需要用戶名和密碼來登錄,否則不能用這樣的方式來登錄.如果你的sql server設置為Windows登錄,那麼在這里就不需要使用"user id"和"password"這樣的方式來登錄,而需要使用"trusted_connection=sspi"來進行登錄.
"initial catalog=northwind":使用的數據源為"northwind"這個資料庫.他的別名為"database",本句可以寫成"database=northwind".
"server=yoursqlserver":使用名為"yoursqlserver"的伺服器.他的別名為"data source","address","addr".如果使用的是本地資料庫且定義了實例名,則可以寫為"server=(local)\實例名";如果是遠程伺服器,則將"(local)"替換為遠程伺服器的名稱或ip地址.
"connect timeout=30":連接超時時間為30秒.
在這里,建立連接對象用的構造函數為:sqlconnection.
其餘的就和access沒有什麼區別了!
********************************************************************************************************************
用c#訪問access資料庫
我編寫這個程序的動機是當我希望用c sharp訪問msaccess資料庫的時候我沒有辦法獲得任何信息和參考材料.網上所能獲得的所有材料都是偏重於sql的,所以我們將分兩步來編寫這個應用程序,第一我們將展示如何連接到msaccess資料庫然後看看它有多復雜.最後,我們就這樣完成了這個程序.
閑言少序,讓我們開始正題.連接到資料庫的過程與我們早先的ado連接過程相比已經發生了較大的變化.下面的圖表恰當的(我希望如此)oledbconnection--> oledbcommand --> oledbdatareader.現在那些熟悉ado的人很明顯能看出兩者的相似之處但是為了使那些還沒有很好的適應ado的人能夠明白,下面是一些解釋.
oledbconnection -->代表對資料庫的單一連接,根據底層資料庫的功能它能給你操縱資料庫的能力.有一點必須記住,雖然oledbconnection對象出了作用范圍,它也不會自動被關閉.所以,你將不得不顯示的調用這個對象的close()方法.
oledbcommand -->這是就象我們在ado中使用的一樣的通常的command對象.你可以通過這個對象調用sql存儲過程或是sql查詢語句.
oledbdatareader -->這個類擁有非常大的重要性因為它提供了實際上的對資料庫底層數據集的訪問.當你調用oledbcommand的executereader方法的時候它就會被創建,.net beta2 sdk說不要直接創建這個類的對象.
現在你可以在.net beta 2的文檔中看到更多的關於這些主要對象的說明,下面是指出如何在程序中訪問資料庫的源代碼.
using system;
using system.data.oledb;
class oledbtest{
public static void main()
{
/創建資料庫連接
oledbconnection aconnection = new oledbconnection("provider=microsoft.jet.oledb.4.0;data source=c:\\db1.mdb");
/創建command對象並保存sql查詢語句
oledbcommand acommand = new oledbcommand("select * from emp_test", aconnection);
try
{
aconnection.open();
/創建datareader 對象來連接到表單
oledbdatareader areader = acommand.executereader();
console.writeline("this is the returned data from emp_test table");
/循環遍歷資料庫
while(areader.read())
{
console.writeline(areader.getint32(0).tostring());
}
/關閉reader對象
areader.close();
/關閉連接,這很重要
aconnection.close();
}
/一些通常的異常處理
catch(oledbexception e)
{
console.writeline("error: {0}", e.errors[0].message);
}
}
}
成功運行這個程序的步驟
1.用msaccess創建一個名叫db1.mdb的資料庫
2.創建一個名叫emp_test的表單
3.使它包含下列數據域
emp_code int
emp_name text
emp_ext text
4.將上面的代碼保存到sample.cs文件中
5.確保資料庫位於c:\並確保mdac2.6或是更新的版本已經被安裝
6.編譯運行
現在讓我們來了解一些我們在oledbconnection對象的構造函數看到的東西的一些細節,在這里你看見諸如"provider="之類的東西.下面是一些和ado.net兼容的驅動程序類型.
sqlolddb --> microsoft ole db provider for sql server,
msra --> microsoft ole db provider forOracle,
microsoft.jet.oledb.4.0 --> ole db provider for microsoft jet
你可以選擇其中的任何一個但是他們會需要傳遞不同的參數,例如jet.oledb.需要傳遞mdb文件的名字而sqloledb需要傳遞用戶名和密碼.
所有這些驅動程序都位於system.data.oledb命名空間里,所以你必須包括它,而且它們和oledb provider for odbc不兼容,也就是說你不能在VB6.0程序里使用這些驅動程序來訪問資料庫,所以不要去尋找解釋為什麼要把這些資料庫放在c:\上的資料了
當你使用microsoft sql server 7.0 或者更新版本的時候,下面是微軟給出的一些指導:
推薦使用.net data provider在下列情況中,使用microsoft sql server 7.0 或者更新版本的中間層應用程序,使用microsoft data engine (msde)或icrosoft sql server 7.0 或者更新版本的單層應用程序.
建議將ole db provider for sql server (sqloledb)和ole db .net data provider一起使用.
對於microsoft sql server 6.5和更早的版本,你必須同時使用ole db provider for sql server 和 ole db.net data provider.
推薦使用microsoft sql server 6.5和更早的版本或是oracle的中間層應用程序使用ole db .net data provider.
對於microsoft sql server 7.0 或者更新版本,推薦sql server .net data provider.
推薦單層應用程序使用microsoft access資料庫.
不推薦一個中間層程序同時使用ole db .net data provider和microsoft access資料庫.
不再支持ole db provider for odbc (msdasql)
⑺ 關於C語言連接SQL資料庫…
1、配置ODBC數據源。
2、使用SQL函數進行連接。
對於1、配置數據源,配置完以後就可以編程操作資料庫了。
對於2、使用SQL函數進行連接,參考代碼如下:
#include<windows.h>
#include<sql.h>
#include<sqlext.h>
void main()
{
HENV henv; //環境句柄
HDBC hdbc; //數據源句柄
HSTMT hstmt; //執行語句句柄
unsigned char datasource[]="數據源名稱"; //即<a href="https://www..com/s?wd=ODBC&tn=44039180_cpr&fenlei=_5y9YIZ0lQzqlpA-" target="_blank" class="-highlight">ODBC</a>源中設置的源名稱
unsigned char user[]= "用戶名"; //資料庫的帳戶名
unsigned char pwd[]= "密碼"; //資料庫的密碼
unsigned char search[]="select xm from stu where xh=0";
SQLRETURN retcode; //記錄各SQL函數的返回情況
// 分配環境句柄
retcode= SQLAllocEnv(&henv); // 等介於 SQLAllocHandle(SQL_HANDLE_ENV, SQL_<a href="https://www..com/s?wd=NULL&tn=44039180_cpr&fenlei=_5y9YIZ0lQzqlpA-" target="_blank" class="-highlight">NULL</a>_HANDLE, &henv);
// 設置ODBC環境版本號為3.0
retcode= SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0);
// 分配連接句柄
retcode= SQLAllocConnect(henv,&hdbc); // 等介於 SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);
//設置連接屬性,登錄超時為*rgbValue秒(可以沒有)
// SQLSetConnectAttr(hdbc, SQL_LOGIN_TIMEOUT, (SQLPOINTER)(rgbValue), 0);
//直接連接數據源
// 如果是windows身份驗證,第二、三參數可以是<a href="https://www..com/s?wd=NULL&tn=44039180_cpr&fenlei=_5y9YIZ0lQzqlpA-" target="_blank" class="-highlight">NULL</a>,也可以是任何字串
//SQL_NTS 即 "<a href="https://www..com/s?wd=Null&tn=44039180_cpr&fenlei=_5y9YIZ0lQzqlpA-" target="_blank" class="-highlight">Null</a>-Terminated String"
retcode= SQLConnect(hdbc,datasource, SQL_NTS, user, SQL_NTS , pwd, SQL_NTS );
//分配語句句柄
retcode= SQLAllocStmt(hdbc,&hstmt); // 等介於 SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);
//直接執行查詢語句
retcode=SQLExecDirect(hstmt,search,SQL_NTS);
//將數據緩沖區綁定資料庫中的相應欄位(i是查詢結果集列號,queryData是綁定緩沖區,BUFF_LENGTH是緩沖區長度)
SQLBindCol(hstmt, i, SQL_C_CHAR, queryData[i-1], BUFF_LENGTH, 0);
//遍歷結果集到相應緩沖區 queryData
SQLFetch(hstmt);
/*
*對遍歷結果的相關操作,如顯示等
*/
//注意釋放順序,否則會造成未知錯誤!
SQLFreeHandle(SQL_HANDLE_STMT, hstmt);
SQLDisconnect(hdbc);
SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
SQLFreeHandle(SQL_HANDLE_ENV, henv);
}
代碼看上去很復雜,其實都可以直接復制。其中需要改的是數據源名稱、資料庫用戶名、資料庫密碼和SQL語句。
然後就是SQLFetch後得到結果集後,如何使用的問題了。
在下面的注釋部分 填寫你的處理代碼即可。
/*
*對遍歷結果的相關操作,如顯示等
*/