C++ 通过ADO为SQL Server设置连接参数

C++ 通过ADO为SQL Server设置连接参数,c++,sql-server,binding,ado,C++,Sql Server,Binding,Ado,是否可以在与SQL Server的连接上设置连接参数,并使该变量在连接的整个生命周期内保持不变?该参数必须可供后续查询使用 我们有一些旧的Access报告,它们在SQL查询中使用了一些VBScript函数,我们称它们为GetStartDate和GetEndDate,它们返回全局变量。我们的应用程序将在调用查询之前设置这些参数,然后查询可以返回应用程序中指定的日期范围之间的信息 我们正在考虑更改为在本地模式下运行的ReportViewer控件,但我看不到在直接t-SQL中使用这些自定义函数的任何方

是否可以在与SQL Server的连接上设置连接参数,并使该变量在连接的整个生命周期内保持不变?该参数必须可供后续查询使用

我们有一些旧的Access报告,它们在SQL查询中使用了一些VBScript函数,我们称它们为GetStartDate和GetEndDate,它们返回全局变量。我们的应用程序将在调用查询之前设置这些参数,然后查询可以返回应用程序中指定的日期范围之间的信息

我们正在考虑更改为在本地模式下运行的ReportViewer控件,但我看不到在直接t-SQL中使用这些自定义函数的任何方便方法

我有两个概念解决方案尚未测试,但我想知道是否有更好的方法。下面是一些伪代码

在运行Recordset.OpenForward之前设置所有变量

Connection->Execute("SET @GetStartDate = ...");  
Connection->Execute("SET @GetEndDate = ...");
// Repeat for all parameters  
这些变量会持续到以后调用Recordset->OpenForward吗?除了另一个SET/SELECT@variable语句之外,还有什么可以重置变量的吗

创建一个ADOCommand工厂,自动将参数添加到我将用于执行SQL的每个ADOCommand对象中

// Command has been previously been created
ADOParameter *Parameter1 = Command->CreateParameter("GetStartDate");
ADOParameter *Parameter2 = Command->CreateParameter("GetEndDate");
// Set values and attach etc...
我想知道的是,是否存在以下情况:

Connection->SetParameter("GetStartDate", "20090101");
Connection->SetParameter("GetEndDate", 20100101");

这些将在连接的生命周期内持续存在,SQL可以执行@GetStartDate之类的操作来访问它们。这可能正是解决方案1,如果变量在连接的整个生命周期内持续存在。

因为没有人敢于给出答案,所以我猜没有一个完美的解决方案,即:

全局游标在连接期间保持不变,可以从任何SQL或存储过程访问,因此您可以在连接上执行一次:

DECLARE KludgeKursor CURSOR GLOBAL STATIC FOR
SELECT StartDate = '2010-01-01', EndDate = '2010-04-30'
OPEN KludgeKursor
在存储过程中:

--get the values
DECLARE @StartDate datetime, @EndDate datetime
FETCH FIRST FROM GLOBAL KludgeKursor
INTO @StartDate, @EndDate

--go crazy
SELECT @StartDate, @EndDate

每个连接只能看到它们自己的值,因此相同的存储过程可用于不同的连接/值。当连接结束时,全局光标将自动解除分配

感谢您的选择。是否可以稍后在连接中更改StartDate和EndDate的值?我对游标不是很在行,但我猜静态意味着一旦创建它就不可变。我相信,你可以更改局部变量的值,但不能更改游标持有的值,即使没有STATIC关键字。不擅长使用游标是件好事。事实上,光标是潘多拉魔盒中的一个恶魔。即使没有静态关键字-sigh,光标也不能保存任何值。我会继续找的。谢谢您的帮助。@taspeotis您可以,但您需要显式关闭并释放游标,然后用新值再次声明它