这几天写一个登陆的东西,用户名和密码是用户输入的,用户名和密码都有可能带单引号,并且没有理由限制用户输入各种各样意想不到的字符,所以最好的办法还是用参数化查询。不过关于 ADO参数化查询 的资料却又太少,不知道是大家觉得这个东西太简单,没必要写出来,还是用的人少。我简单整理了一下,仅供后来人查询方便。BOOL Login(_ConnectionPtr conn , LPCTSTR username , LPCTSTR password)
{
try
{
_CommandPtr cmd ; 
cmd.CreateInstance(__uuidof(Command)) ; 

CString sql ; 
sql.Format("SELECT * FROM USER WHERE USERID=? AND PASSWORD=?") ; 

// username 
_ParameterPtr pParamUsername = cmd->CreateParameter(_bstr_t("USERID") , adBSTR , adParamInput , strlen(username) , username) ; //strlen(username) 这个参数好像没什么用,不知道我用错没有。
cmd->Parameters->Append(pParamUsername) ;  // password 
_ParameterPtr pParamPassword = cmd->CreateParameter(_bstr_t("PASSWORD")  , adBSTR , adParamInput , strlen(password) , password) ; 
cmd->Parameters->Append(pParamPassword) ; 

cmd->ActiveConnection = conn ; 
cmd->CommandText = (LPCTSTR)sql ; 

_RecordsetPtr set = cmd->Execute(NULL,NULL,adCmdText) ; 


while( !set->adoEOF ) 
{
// 这里处理数据
                  // 以下省略…… set->MoveNext() ; 
} }
catch( _com_error *e)  // 异常处理
{
}
catch(...)
{
}
     // 以下省略……
}

解决方案 »

  1.   

    Parameter 对象
                Parameter 对象代表与基于参数化查询或存储过程的 Command 对象相关联的参数或自变量。
    说明许多提供者都支持参数化的命令。需要进行的操作在这些命令中只定义一次,但可以使用变量(或参数)改变命令的某些细节。例如,SQL SELECT 语句可使用参数定义 WHERE 子句的匹配条件,而使用另一个参数来定义 SORT BY 子句的列的名称。Parameter 对象代表与参数化查询关联的参数,或进/出参数以及存储过程的返回值。取决于提供者的功能,Parameter 对象的某些集合、方法或属性有可能无效。使用 Parameter 对象的集合、方法、和属性可进行如下操作: 使用 Name 属性可设置或返回参数名称。
    使用 Value 属性可设置或返回参数值。
    使用 Attributes 和 Direction、Precision、NumericScale、Size 以及 Type 属性可设置或返回参数特性。
    使用 AppendChunk 方法可将长整型二进制或字符数据传递给参数。 
    如果知道与想要调用的存储过程或参数化查询相关联的参数属性和名称,则可使用 CreateParameter 方法创建带有相应属性设置的 Parameter 对象,并使用 Append 方法将它们添加到 Parameters 集合。这样就可以设置并返回参数值,而无需调用 Parameters 集合的 Refresh 方法来检索提供者的参数信息,即潜在的、资源集中的操作。
      

  2.   

    CreateParameter 方法
          使用指定属性创建新的 Parameter 对象。语法Set parameter = command.CreateParameter (Name, Type, Direction, Size, Value)返回值返回 Parameter 对象。参数Name   可选,字符串,代表 Parameter 对象名称。Type   可选,长整型值,指定 Parameter 对象数据类型。关于有效设置请参见 Type 属性。Direction   可选,长整型值,指定 Parameter 对象类型。关于有效设置请参见 Direction 属性。Size   可选,长整型值,指定参数值最大长度(以字符或字节数为单位)。Value   可选,变体型,指定 Parameter 对象的值。说明使用 CreateParameter 方法可用指定的名称、类型、方向、大小和值创建新的 Parameter 对象。在参数中传送的所有值都将写入相应的 Parameter 属性。该方法无法自动将 Parameter 对象追加到 Command 对象的 Parameter 集合,这样就可以设置附加属性。如果将 Parameter 对象追加到集合,则 ADO 将使该附加属性的值生效。如果在 Type 参数中指定可变长度的数据类型,那么在将它追加到 Parameters 集合之前必须传送 Size 参数或者设置 Parameter 对象的 Size 属性;否则将产生错误。
      

  3.   

    我连SQL语句都不熟,不要问我哦。 *^_^*
      

  4.   

    iuhxq(小灰) :应该可以吧。但是如果以后又要考虑其他的特例呢,还是用参数化查询好一些。参数化查询具体都有什么好处,我也不是很清楚。
    也希望有高手来给讲讲。我最多可以给帖子加到200分。