最简单的vc++调用存储过程实例(有参无参)

合集下载

存储过程实例讲解

存储过程实例讲解

存储过程实例讲解嘿,朋友们!今天咱就来讲讲这存储过程。

你说这存储过程啊,就像是一个魔法盒子,里面装满了各种奇妙的代码和逻辑。

想象一下,你有一堆复杂的任务,就像要组装一个超级复杂的模型,零件多得让你眼花缭乱。

这时候,存储过程就出现啦!它把这些零散的代码片段整合在一起,变成一个有组织、有纪律的团队。

比如说,在一个大型的数据库系统里,你可能需要经常执行一些特定的操作,比如查询某些数据、更新某些记录等等。

如果每次都要重新写那些代码,多麻烦呀!但是有了存储过程,就相当于你有了一个专门的工具,只要调用它就可以轻松完成这些任务啦。

它就像是一个经验丰富的大厨,各种食材在它手里就能变成美味佳肴。

它把那些复杂的逻辑和步骤都封装起来,让我们这些使用者不用再去头疼那些细节。

再打个比方,你要去一个很远的地方旅行,你可以选择自己一点点摸索路线,也可以直接找一个专业的导游。

存储过程就是那个导游呀,它熟悉路线,知道哪里有好玩的,哪里要注意。

而且哦,存储过程还很灵活呢!你可以根据自己的需求随时修改它,就像给那个魔法盒子重新布置里面的东西一样。

它能适应各种不同的情况,是不是很厉害?你看,在实际应用中,很多企业都会用到存储过程。

它能提高效率,让整个系统运行得更加顺畅。

就像一辆汽车,有了好的发动机,才能跑得更快更稳嘛。

比如说,在一个电商网站上,处理订单的过程就可以用存储过程来优化。

从下单到发货,这中间有好多步骤呢,要是没有存储过程来帮忙,那得多乱呀!还有啊,在金融系统里,存储过程也发挥着重要的作用。

各种交易的处理、数据的计算,都离不开它呢。

总之,存储过程就像是数据库世界里的一颗璀璨明星,照亮了我们前进的道路。

它让我们的编程工作变得更加轻松、高效,真的是太棒啦!大家可千万别小看它哦,好好去研究研究,你一定会发现它更多的神奇之处的!怎么样,是不是对存储过程有了更深的了解呢?还等什么,赶紧去试试吧!。

oracle存储过程学习经典语法实例调用

oracle存储过程学习经典语法实例调用

O r a c l e存储过程学习目录Oracle存储过程基础知识商业规则和业务逻辑可以通过程序存储在Oracle中,这个程序就是存储过程。

存储过程是SQL, PL/SQL, Java 语句的组合,它使你能将执行商业规则的代码从你的应用程序中移动到数据库。

这样的结果就是,代码存储一次但是能够被多个程序使用。

要创建一个过程对象 procedural object ,必须有 CREATE PROCEDURE 系统权限。

如果这个过程对象需要被其他的用户schema 使用,那么你必须有 CREATE ANY PROCEDURE 权限。

执行procedure 的时候,可能需要excute权限。

或者EXCUTE ANY PROCEDURE 权限。

如果单独赋予权限,如下例所示:grant execute on MY_PROCEDURE to Jelly调用一个存储过程的例子:execute MY_PROCEDURE 'ONE PARAMETER' ;存储过程 PROCEDURE 和函数 FUNCTION 的区别。

function有返回值,并且可以直接在Query中引用function和或者使用function的返回值。

本质上没有区别,都是 PL/SQL 程序,都可以有返回值。

最根本的区别是:存储过程是命令, 而函数是表达式的一部分。

比如:select max NAME FROM但是不能 exec max NAME 如果此时max是函数。

PACKAGE是function,procedure,variables 和sql 语句的组合。

package允许多个procedure使用同一个变量和游标。

创建 procedure的语法:Sql 代码:可以使用 create or replace procedure 语句, 这个语句的用处在于,你之前赋予的excute 权限都将被保留。

IN, OUT, IN OUT用来修饰参数。

s t a c k 的 常 见 用 法

s t a c k 的 常 见 用 法

VC调试技巧之Call StackVC调试技巧之Call Stack简单介绍调试是程序开发者必备技巧。

如果不会调试,自己写的程序一旦出问题,往往无从下手。

本人总结10年使用VC经验,对调试技巧做一个粗浅的介绍。

希望对大家有所帮助。

今天简单的介绍介绍调用堆栈。

调用堆栈在我的专栏的文章VC 调试入门提了一下,但是没有详细介绍。

首先介绍一下什么叫调用堆栈:假设我们有几个函数,分别是function1,function2,function3,funtion4,且function1调用function2,function2调用function3,function3调用function4。

在function4运行过程中,我们可以从线程当前堆栈中了解到调用他的那几个函数分别是谁。

把函数的顺序关系看,function4、function3、function2、function1呈现出一种“堆栈”的特征,最后被调用的函数出现在最上方。

因此称呼这种关系为调用堆栈(call stack)。

当故障发生时,如果程序被中断,我们基本上只可以看到最后出错的函数。

利用call stack,我们可以知道当出错函数被谁调用的时候出错。

这样一层层的看上去,有时可以猜测出错误的原因。

常见的这种中断时ASSERT宏导致的中断。

在程序被中断时,debug工具条的右侧倒数第二个按钮一般是call stack按钮,这个按钮被按下后,你就可以看到当前的调用堆栈。

实例一:介绍我们首先演示一下调用堆栈。

首先我们创建一个名为Debug的对话框工程。

工程创建好以后,双击OK按钮创建消息映射函数,并添加如下代码:?void CDebugDlg::OnOK()?-- TODO: Add extra validation here?ASSERT(FALSE);?我们按F5开始调试程序。

程序运行后,点击OK按钮,程序就会被中断。

这时查看call stack窗口,就会发现内容如下:?CDebugDlg::OnOK() line 176 + 34 bytes_AfxDispatchCmdMsg(CCmdTarget * 0x0012fe74 {CDebugDlg}, unsigned int 1, int 0, void (void)* 0x5f402a00 `vcall'(void), void * 0x00000000, unsigned int 12, AFX_CMDHANDLERINFO * 0x00000000) line 88CCmdTarget::OnCmdMsg(unsigned int 1, int 0, void * 0x00000000, AFX_CMDHANDLERINFO * 0x00000000) line 302 + 39 bytesCDialog::OnCmdMsg(unsigned int 1, int 0, void * 0x00000000, AFX_CMDHANDLERINFO * 0x00000000) line 97 + 24 bytes CWnd::OnCommand(unsigned int 1, long 656988) line 2088CWnd::OnWndMsg(unsigned int 273, unsigned int 1, long 656988, long * 0x0012f83c) line 1597 + 28 bytesCWnd::WindowProc(unsigned int 273, unsigned int 1, long 656988) line 1585 + 30 bytesAfxCallWndProc(CWnd * 0x0012fe74 {CDebugDlg hWnd=?}, HWND__ * 0x001204b0, unsigned int 273, unsigned int 1, long 656988) line 215 + 26 bytesAfxWndProc(HWND__ * 0x001204b0, unsigned int 273, unsigned int 1, long 656988) line 368AfxWndProcBase(HWND__ * 0x001204b0, unsigned int 273, unsigned int 1, long 656988) line 220 + 21 bytesUSER32! 77d48709()USER32! 77d487eb()USER32! 77d4b368()USER32! 77d4b3b4()NTDLL! 7c90eae3()USER32! 77d4b7ab()USER32! 77d7fc9d()USER32! 77d76530()USER32! 77d58386()USER32! 77d5887a()USER32! 77d48709()USER32! 77d487eb()USER32! 77d489a5()USER32! 77d489e8()USER32! 77d6e819()USER32! 77d65ce2()CWnd::IsDialogMessageA(tagMSG * 0x004167d8 {msg=0x00000202 wp=0x00000000 lp=0x000f001c}) line 182 CWnd::PreTranslateInput(tagMSG * 0x004167d8 {msg=0x00000202 wp=0x00000000 lp=0x000f001c}) line 3424 CDialog::PreTranslateMessage(tagMSG * 0x004167d8 {msg=0x00000202 wp=0x00000000 lp=0x000f001c}) line 92 CWnd::WalkPreTranslateTree(HWND__ * 0x001204b0, tagMSG * 0x004167d8 {msg=0x00000202 wp=0x00000000 lp=0x000f001c}) line 2667 + 18 bytesCWinThread::PreTranslateMessage(tagMSG * 0x004167d8 {msg=0x00000202 wp=0x00000000 lp=0x000f001c}) line 665 + 18 bytesCWinThread::PumpMessage() line 841 + 30 bytesCWnd::RunModalLoop(unsigned long 4) line 3478 + 19 bytes CDialog::DoModal() line 536 + 12 bytesCDebugApp::InitInstance() line 59 + 8 bytesAfxWinMain(HINSTANCE__ * 0x00400000, HINSTANCE__ *0x00000000, char * 0x00141f00, int 1) line 39 + 11 bytes WinMain(HINSTANCE__ * 0x00400000, HINSTANCE__ * 0x00000000, char * 0x00141f00, int 1) line 30WinMainCRTStartup() line 330 + 54 bytesKERNEL32! 7c816d4f()这里,CDebugDialog::OnOK作为整个调用链中最后被调用的函数出现在call stack的最上方,而内核中程序的启动函数Kernel32! 7c816d4f()则作为栈底出现在最下方。

带参数的存储过程

带参数的存储过程

带参数的存储过程创建一个带参数的存储过程通常需要以下几个步骤:1.创建存储过程的语法如下:```sqlCREATE PROCEDURE procedure_name (parameter1 datatype, parameter2 datatype, ...)BEGIN--存储过程的逻辑END;```其中,`procedure_name` 是存储过程的名称,`parameter1`、`parameter2` 是存储过程的参数名,`datatype` 是参数的数据类型。

2.在存储过程中编写具体的逻辑。

```sqlCREATE PROCEDURE get_product_by_category (IN category_id INT) BEGINSELECT * FROM products WHERE category = category_id;END;```这个例子中,我们创建了一个名为 `get_product_by_category` 的存储过程,它接受一个 `category_id` 参数,并返回符合该category_id 的产品。

3.在存储过程中使用参数。

在存储过程中使用参数可以通过在查询语句中插入参数的方式来实现。

```sqlCREATE PROCEDURE update_product_price (IN product_id INT, IN new_price DECIMAL(10,2))BEGINUPDATE products SET price = new_price WHERE id = product_id;END;```这个例子中,我们创建了一个名为 `update_product_price` 的存储过程,它接受两个参数 `product_id` 和 `new_price`,并将指定的产品的价格更新为新的价格。

4.调用带参数的存储过程。

要调用带参数的存储过程,可以使用`CALL`关键字并传递参数的值。

C#中使用EntityFramework(EF)生成实体进行存储过程的调用

C#中使用EntityFramework(EF)生成实体进行存储过程的调用
在ef中使用定义对象模型的方式调用一个存储过程这个存储过程返回的是一组包含两列的值
C#中使用 EntityFramework( EF)生成实体进行存储过程的调用
在EF中使用定义对象模型的方式调用一个存储过程ame,Count)
下面是存储过程:
var userIDParameter = userID != null ? new ObjectParameter("userID", userID) : new ObjectParameter("userID", typeof(string));
return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction<Pro_Project_By_UserID_Result> ("Pro_Project_By_UserID_UserID", userIDParameter);
GROUP BY Project
在DB中定义了这个SP后,在C#中的*.edmx中,选择‘从数据库更新模型’,更新方式和更新表一样。这样在C#中就会生成
Pro_Project_By_UserID_Result
的类,还有一个函数
public virtual ObjectResult<Pro_Project_By_UserID_Result> Pro_Project_By_UserID(string userID) {
CREATE procedure [dbo].[Pro_Project_By_UserID] @userID nvarchar(36)
AS SELECT Project AS ProjectTypeName, Count(BA.ProjectId) AS ProjectCount FROM dbo.B_AllProjectInfo BA WHERE IsComplex = 1 AND UserId = @userID

C#数据库(c#通过调用存储过程返回表)

C#数据库(c#通过调用存储过程返回表)

通过调⽤存储过程不但能返回值,还能返回⼀张表,下⾯的代码中实现了创建⼀个临时表,并返回这个表(⽀持多个)的⽤法。

希望对⼤家有帮助, Examda提⽰: 这⾥还涉及到⼀个临时表的创建,什么是sql server真正的临时表,并发不冲突的临时表,要让系统建⽴在tempdb中才是,sql server会⾃动管理这些临时表 c#代码如下 DataSet ds = new DataSet(); System.Data.OleDb.OleDbCommand cmd = m_TdlyDataAccess.DBConnection.CreateCommand(); mandText = "prcTest"; mandType = CommandType.StoredProcedure; System.Data.OleDb.OleDbDataAdapter dap = new System.Data.OleDb.OleDbDataAdapter(cmd); dap.Fill(ds); 存储过程如下 SET QUOTED_IDENTIFIER ON GO SET ANSI_NULLS ON GO CREATE PROCEDURE [dbo].[prcTest] AS begin CREATE TABLE #t(x INT PRIMARY KEY,y int default 0,z int default 0) INSERT INTO #t VALUES (99,0,0) INSERT INTO #t VALUES (239,0,0) INSERT INTO #t VALUES (939,0,0) select * from #t drop table #t end GO SET QUOTED_IDENTIFIER OFF GO SET ANSI_NULLS ON GO。

VC ADO调用存储过程

VC ADO调用存储过程

VC ADO调用存储过程关于ADO调用存储过程的标准的做法:按照以下步骤进行:1、生成并初始化一个_CommandPtr对象;2、生成调用存储过程需要的参数,这些参数都是_ParameterPtr对象;3、按照顺序将使用_CommandPtr的Append方法为存储过程提供参数(包括输入参数和输出参数);4、为_CommandPtr对象指定需要使用的ADO连接等;5、使用_CommandPtr的Execute方法调用存储过程;6、从结果中获取返回参数的值(如果有的话)。

具体的过程详见代码。

附加说明:1、关于CreateParameter函数,该函数的原型为:CreateParameter (Name, Type, Direction, Size, Value);其中:Name是参数的名称,可以指定也可以不指定;Type是一个DataTypeEnum值,指定参数的类别,取值有adInteger(整型)、adChar (字符/字符串型)等;Direction是一个ParameterDirectionEnum值,其取值为adParamInput、adParamInputOutput、adParamOutput、adParamReturnValue、adParamUnknown;Size是一个Long类型的值,指示该参数值以字节计算的最大长度,例如对int型,该值可以取为sizeof(int),对Long型,该值可以取为sizeof(long),对字符串型,可以使用该字符串的长度;Value是一个variant类型的值,是该参数的取值。

在这里需要注意的是,Type参数、Direction参数以及Size参数一定要和存储过程定义时的参数相吻合,例如,如果有下面一个存储过程CREATE OR REPLACE PROCEDURE SMS_Proc_Handle_All(UserID Integer,SourAddr varchar(15),DestAddr varchar(5000),AvValue OUTPUT Single,ReturnInfo OUTPUT varchar(100))则Type参数的取值依次为adInteger、adChar、adChar、adSingle,adChar;Direction参数的取值依次为adParameterIn、adParameterIn、adParameterIn、adParameterOut、adParameterOut;对于输入参数,Size的值可以根据实际数值来定,对于输出参数,最好是根据定义确定(上例中ReturnInfo参数的Size值可以取为100)。

oracle 存储过程优秀例子

oracle 存储过程优秀例子

oracle 存储过程优秀例子Oracle存储过程是一种在数据库中存储和执行SQL语句的过程。

它可以接受参数并返回结果,用于实现复杂的业务逻辑和数据操作。

下面是10个优秀的Oracle存储过程示例,展示了不同方面的功能和用法。

1. 创建表并插入数据```sqlCREATE PROCEDURE create_employee_table ASBEGINEXECUTE IMMEDIATE 'CREATE TABLE employee (id NUMBER, name VARCHAR2(100))';EXECUTE IMMEDIATE 'INSERT INTO employee VALUES (1, ''John Doe'')';EXECUTE IMMEDIATE 'INSERT INTO employee VALUES (2, ''Jane Smith'')';END;```这个存储过程创建了一个名为employee的表,并插入了两条数据。

2. 更新员工姓名```sqlCREATE PROCEDURE update_employee_name(p_id NUMBER,p_name VARCHAR2) ASBEGINUPDATE employee SET name = p_name WHERE id = p_id;COMMIT;END;```这个存储过程接受员工的ID和新的姓名作为参数,然后更新对应员工的姓名。

3. 删除员工记录```sqlCREATE PROCEDURE delete_employee(p_id NUMBER) AS BEGINDELETE FROM employee WHERE id = p_id;COMMIT;END;```这个存储过程接受员工的ID作为参数,然后删除对应的员工记录。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

adVarChar,
m_ch_fname,
sizeof(m_ch_fname), m_ul_fnameStatus, false)
ADO_VARIABLE_LENGTH_ENTRY2(4, adVarChar, m_ch_lname, sizeof(m_ch_lname),
m_ul_lnameStatus, false)
//--------------------------------------------------------------Cmd1.CreateInstance(__uuidof(Command)); system("pause"); printf("command type .... \n\n"); Param1 = Cmd1->CreateParameter(_bstr_t(bstrEmpty),//创建 Parameter 对象 adInteger, adParamInput, -1, _variant_t((long)5)); Param1->Value = _variant_t(long(5)); Param1->Name = "成都";//存储过程参数名称
Rs1->MoveNext(); count++;//统计表中记录个数 } } catch (_com_error &e ) { printf("Error:\n"); printf("Code = %08lx\n", e.Error()); printf("Meaning = %s\n", e.ErrorMessage()); printf("Source = %s\n", (LPCSTR) e.Source()); printf("Description = %s\n", (LPCSTR) e.Description()); }//其实这个 catch 中内容很是强大,各种错误都能描述,比如找不到表啊什么的 ::CoUninitialize(); return 0; }
详细步骤如下:
1、 首先在数据库下新建表 AjaxCity 本人 SQLServer 目录如下:
表内容仅供参考:
2、 新建存储过程 mysp_all 所有元素并返回记录集
3、 Vc6 中直接新建 win32 控制台程序的空工程,添加文件 hello.cpp,添加代码如下:
#import "C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF", "EndOfFile")
#include <icrsint.h> #include <stdio.h>
_COM_SMARTPTR_TYPEDEF(IADORecordBinding, __uuidof(IADORecordBinding));
inline void TESTHR(HRESULT _hr) { if FAILED(_hr) _com_issss CCustomRs : public CADORecordBinding
{
BEGIN_ADO_BINDING(CCustomRs)
ADO_VARIABLE_LENGTH_ENTRY2(2,
END_ADO_BINDING()
public:
CHAR m_ch_fname[22]; CHAR m_ch_lname[32]; ULONG m_ul_fnameStatus; ULONG m_ul_lnameStatus; }; //====================================================================== int main() { ::CoInitialize(NULL); _ConnectionPtr Conn1; _CommandPtr Cmd1; _RecordsetPtr Rs1; ParametersPtr *Params1 = NULL ; _ParameterPtr Param1; //-----------------------------------------------------------------------------
Param1->Type = adChar ;//参数类型 Param1->Size = 32;//参数大小
Cmd1->Parameters->Append(Param1);//parameter 是 command 查询的参数
system("pause"); printf("create paramater .... \n\n");
Cmd1->ActiveConnection = Conn1 ; Cmd1->CommandText = _bstr_t("mysp_para");//sp name Cmd1->CommandType = adCmdStoredProc;
if( FAILED( Rs1.CreateInstance(__uuidof(Recordset)) ) )//创建 Rs1 printf("ri ,shi bai le \n\n");
printf("%d \n",count);//显然这里只有一个,为了防止输不出来,我们选择这样 执行结果如下:
5、 Hello.cpp 中 try 括号内的内容改为如下代码:(加粗部分为与上面代码不同的地方) Conn1.CreateInstance(__uuidof(Connection)); if( Conn1->Open(bstrConnect,bstrEmpty,bstrEmpty,adOptionUnspecified) ==0 ) { system("pause"); printf("open connection .... \n\n"); } Conn1->CursorLocation = adUseClient ;//adUseClient 使用由本地游标库 提//供的客户端游标。本地游标引擎通常允许使用的许多功能可能是驱 动程//序提供的游标无法使用的,因此使用该设置对于那些将要启用的 功能//是有好处的
//////////////////////////////////////////////////////////////////////////////////////////// Rs1 = Cmd1->Execute(NULL,NULL,adCmdStoredProc);
//////////////////////////////////////////////////////////////////////////////////////////// int count = 1; while (! Rs1->EndOfFile ) { printf("%d \n",count); Rs1->MoveNext(); count++;//统计表中记录个数 }
开发环境:SQL Server2000,Visual C++6.0 简单说明: 1、本程序是最简单的控制台示范程序,示范代码从 MSDN 中拷得,调试可以运行,添加详 细注解 。如要源码,可邮件至:xialia8@ 2、最简单的示范了有参数和无参数情况下,存储过程的调用情况,希望对新学习的有所帮 助。最初学习的时候,也搜了很多东西才完成
system("pause"); printf("open connection .... \n\n"); } // Cmd1->Parameters->Append(Param1);//parameter 是 command 用于查询的参数 //所以,存储过程不需要参数,就不用 append 这个 parameter 到 command 对象 Cmd1.CreateInstance(__uuidof(Command)); Cmd1->ActiveConnection = Conn1 ;//命令对象必须与连接对象关联 Cmd1->CommandText = _bstr_t("mysp_all");//sp name Cmd1->CommandType = adCmdStoredProc;// commandType 表明是存储过程 if( FAILED( Rs1.CreateInstance(__uuidof(Recordset)) ) )//创建 Rs1 printf("ri ,shi bai le \n\n"); //////////////////////////////////////////////////////////////////////////////////////////// Rs1 = Cmd1->Execute(NULL,NULL,adCmdStoredProc);//执行存储过程 //////////////////////////////////////////////////////////////////////////////////////////// //------------------------------------------------------------------int count = 1; while (! Rs1->EndOfFile ) { printf("%d \n",count);
char bstrConnect[150] = "Provider=SQLOLEDB.1;Integrated Security=SSPI; \ Persist Security Info=False;Initial Catalog=xiali;Data Source=(local)"; char bstrEmpty[2]=""; _variant_t vtEmpty = new _variant_t(); //----------------------------------------------------------------------------try { Conn1.CreateInstance(__uuidof(Connection)); if( Conn1->Open( bstrConnect,bstrEmpty,bstrEmpty, adOptionUnspecified) ==0 ) {
相关文档
最新文档