如何在C語言里面執行SQL語句
C語言程序與數據庫打交道的方式分為直連(同步)和非直連(異步)兩種,它們的特點如下所示:
1. 直連方式
在該方式中,C語言程序直接與數據庫進行消息的交互。
該方式的優點是消息交互是即時的,C語言程序向數據庫發送消息之后,很快就能夠得到結果;缺點是如果數據庫執行緩慢,那么C語言程序需要掛在那里等待結果,影響了程序執行效率。
2. 非直連方式
在該方式中,C語言程序通過一個獨立的第三方模塊間接與數據庫進行消息的交互。
該方式的優點是當C語言程序向第三方模塊發送消息之后,可以不用等待數據庫返回結果而去執行其它流程;缺點是如果消息序列號沒有定義好,那么極有可能會導致第三方模塊返回的結果出現混亂。因此,在該方式中,定義好發送消息的順序(即設定好序列號)很重要。
由于需要與數據庫打交道,因此要在C語言程序所使用的配置文件中填寫好關聯數據庫的相關信息,如數據庫機器的IP地址、端口號、用戶名、密碼、模塊號和所操作的具體數據庫名等。在運行程序之前,一定要確保相關配置項信息的正確性。
c/c++怎么連接數據庫,并執行SQL語句
C++連接SQL數據庫第一步 系統配置1.設置SQLSERVER服務器為SQL登錄方式,并且系統安全性中的sa用戶要設置登錄功能為“啟用”,還有必須要有密碼。
2.需要在ODBC中進行數據源配置,數據源選\”SQL SERVER”,登錄方式使用“使用輸入用戶登錄ID和密碼的SQL SERVER驗證”,并填寫登錄名(sa)和密碼,注意一點,密碼不能為空,這就意味著你的sa用戶必須得有密碼。否則無法通過系統本身的安全策略。
測試通過就完成了配置。C++連接SQL數據庫第二步 C++與SQL連接初始化1.在你所建立的C++項目中的stdafx.h頭文件中引入ADO 具體代碼如下#import “c:\Program Files\Common Files\System\ado\*” no_namespace rename(”EOF”, “adoEOF”) rename(”BOF”, “adoBOF”) 2.定義_ConnectionPtr變量后調用Connection對象的Open方法建立與服務器的連接。
數據類型_ConnectionPtr實際上是由類模板_com_ptr_t得到的一個具體的實例類。_ConnectionPtr類封裝了Connection對象的Idispatch接口指針及其一些必要的操作。
可以通過這個指針操縱Connection對象。例如連接SQLServer數據庫,代碼如下://連接到MS SQL Server //初始化指針 _ConnectionPtr pMyConnect = NULL; HRESULT hr = *Instance(__uuidof(Connection)); if (FAILED(hr)) return; //初始化鏈接參數 _bstr_t strConnect = “Provider=SQLOLEDB; Server=hch; Database=mytest; uid=sa; pwd=sa;”; //Database指你系統中的數據庫 //執行連接 try { // Open方法連接字串必須四BSTR或者_bstr_t類型 pMyConnect->Open(strConnect, “”, “”, NULL); } catch(_com_error &e) { MessageBox(*ption(), “警告”, MB_OK|MB_ICONINFORMATION); }//發生鏈接錯誤 C++連接SQL數據庫第三步 簡單的數據連接//定義_RecordsetPtr變量,調用它Recordset對象的Open,即可打開一個數據集 //初始化過程 以下是個實例 _RecordsetPtr pRecordset; if (FAILED(*Instance(__uuidof(Recordset)))) { return; } //執行操作 try { pRecordset->Open(_variant_t(”userinfo”), _variant_t((IDispatch*)pMyConnect), adOpenKeyset, adLockOptimistic, adCmdTable); } catch (_com_error &e) { MessageBox(”無法打開userinfo表\”, “系統提示”, MB_OK|MB_ICONINFORMATION); } C++連接SQL數據庫第四步 執行SQL語句 這里是關鍵,我認為只要你懂點SQL語句那么一切都會方便許多比用上面的方法簡單,更有效率點。
首先 m_*Instance(_uuidof(Connection)); //初始化Connection指針 m_*Instance(__uuidof(Recordset));//初始化Recordset指針 CString strSql=”select * from tb_goods”;//具體執行的SQL語句 m_pRecordset=m_pConnection->Execute(_bstr_t(strSql), NULL, adCmdText);//將查詢數據導入m_pRecordset數據容器 至此 你的SQL語句已經執行完成了m_pRecordset內的數據就是你執行的結果。取得記錄:while(!m_pRecordset->adoEOF)//遍歷并讀取name列的記錄并輸出 { CString temp = (TCHAR *)(_bstr_t)m_pRecordset->GetFields()->GetItem (”name”)->Value; AfxMessageBox(temp); pRecordset->MoveNext(); } 插入記錄//記得初始化指針再執行以下操作 CString strsql; *(”insert into tb_goods(no,name, price) values('%d','%s', %d)”,m_intNo,m_strName,m_intPrice); m_pRecordset=m_pConnection-> Execute(_bstr_t(strsql),NULL,adCmdText); 修改記錄 CString strsql; *(”update tb_goods set name='%s' , price=%d where no=%d “,m_strName,m_intPrice,m_intNo); m_pRecordset=m_pConnection->Execute(_bstr_t(strsql),NULL,adCmdText); 刪除記錄 CString strsql; *(”delete from tb_goodswhere no= '%d' “,m_intNo); m_pRecordset=m_pConnection->Execute(_bstr_t(strsql),NULL,adCmdText)。
如何動態執行sql語句
這里只介紹動態SQL的使用。
關于動態SQL語句的語法,參見:http://**chiclewu/article/details/160971331.什么是時候需要使用動態SQL?SQL文本在編譯時是未知的。例如,SELECT語句包含的標識符(如表名)在編譯時是未知的,或者WHERE子句的條件數量在編譯時是未知。
靜態SQL不支持例如,在PL/SQL中用靜態SQL只能執行查詢以及DML語句。如果想要執行DDL語句,只能使用動態SQL。
當讓使用靜態SQL,也有它的好處:編譯成功驗證了靜態SQL語句引用有效的數據庫對象和訪問這些對象的權限編譯成功創建了模式對象的依賴關系*E IMMEDIATE語句EXECUTE IMMEDIATE語句的意思是使用本地動態SQL處理大多數動態SQL語句。如果動態SQL語句是自包含的(也就是說,它的綁定參數沒有占位符,并且結果不可能返回錯誤),則EXECUTE IMMEDIATE語句不需要子句。
如果動態SQL語句包行占位符綁定參數,每個占位符在EXECUTE IMMEDIATE語句的子句中必須有一個相應的綁定參數,具體如下:如果動態SQL語句是一個最多只能返回一行的SELECT語句,OUT綁定參數放置在INTO子句,IN綁定參數放置在USING子句。如果動態SQL語句是一個可以返回多行的SELECT語句,OUT綁定參數放置在BULK COLLECT INTO子句,IN綁定參數放置在USING子句。
如果動態SQL語句是一個除了SELECT以外的其他DML語句,且沒有RETURNING INTO子句,所有的綁定參數放置在USING子句中。如果動態SQL還語句一個匿名PL/SQL塊或CALL語句,把所有的綁定參數放置在USING子句中。
如果動態SQL語句調用一個子程序,請確保:每個對應子程序參數占位符的綁定參數與子程序參數具有相同的參數模式和兼容的數據類型。綁定參數不要有SQL不支持的數據類型(例如,布爾類型,關聯數組,以及用戶自定的記錄類型)USING子句不能包含NULL字面量。
如果想要在USING子句中使用NULL值,可以使用位初始化的變量或者函數顯示將NULL轉換成一個有類型的值。2.1動態SQL語句是一個最多只能返回一行的SELECT語句使用動態SQL語句返回單列,查詢SCOTT的薪水:declare v_sql_text varchar2(1000); v_sal number; v_ename *%type := 'SCOTT'; begin v_sql_text := 'select * from emp e where * = :ename'; execute immediate v_sql_text into v_sal using v_ename; dbms_*_line(v_ename || ':' || v_sal);end;使用動態SQL返回一條記錄,查詢SCOTT的基本信息:declare v_sql_text varchar2(1000); v_ename *%type := 'SCOTT'; vrt_emp emp%rowtype; begin v_sql_text := 'select * from emp e where * = :ename'; execute immediate v_sql_text into vrt_emp using v_ename; dbms_*_line(v_ename || '的基本信息:'); dbms_*_line('工號:' || vrt_*); dbms_*_line('工資:' || vrt_*); dbms_*_line('入職日期:' || vrt_*te);end;2.2動態SQL語句是一個可以返回多行的SELECT語句2.2.1只有一個占位符使用動態SQL語句返回多行記錄,查詢30部門的員工基本信息:declare v_sql_text varchar2(1000); v_deptno *%type := 30; type nt_emp is table of emp%rowtype; vnt_emp nt_emp; begin v_sql_text := 'select * from emp e where * = :deptno'; execute immediate v_sql_text bulk collect into vnt_emp using v_deptno; for i in 1 .. vnt_* loop dbms_*_line(vnt_emp(i).ename || '的基本信息:'); dbms_*_line('工號:' || vnt_emp(i).empno); dbms_*_line('工資:' || vnt_emp(i).sal); dbms_*_line('入職日期:' || vnt_emp(i).hiredate); dbms_*_line(''); end loop;end2.2.2多個占位符查詢20部門工資大于2000的員工基本信息:declare v_sql_text varchar2(1000); v_deptno *%type := 20; v_sal number := 2000; type nt_emp is table of emp%rowtype; vnt_emp nt_emp; begin v_sql_text := 'select * from emp e where *>:sal and * = :deptno'; execute immediate v_sql_text bulk collect into vnt_emp using v_sal, v_deptno; --注意綁定多個變量時,綁定變量只與占位符位置有關,與占位符名稱無關, for i in 1 .. vnt_* loop dbms_*_line(vnt_emp(i).ename || '的基本信息:'); dbms_*_line('工號:' || vnt_emp(i).empno); dbms_*_line('工資:' || vnt_emp(i).sal); dbms_*_line('入職日期:' || vnt_emp(i).hiredate); dbms_*_line(''); end loop;注意:對于SQL文本,占位符名稱是沒有意義的,綁定變量與占位符名稱無關,只與占位符的配置有關。
即使有多個相同名稱占位符,也需要每個占位符對應一個綁定變量。對于PL/SQL塊,占位符名稱是有意義的,相同名稱的占位符,只需要第一個占位符綁定變量。
2.3動態SQL語句是一個帶有RETURNING子句的DML語句KING的工資增長20%,返回增長后的工資:eclare v_sql_text varchar2(1000); v_sal 。