用ADO:
    dim myID as long
    myID=1000    dim cnn as adodb.connection
    set cnn=new adodb.connection
    cnn.open .............'連接到SQL Server或者Access, 兩個連接串都肯定沒問題    Dim cmd As New ADODB.Command
    cmd.CommandType = adCmdText 
    Set cmd.ActiveConnection = cnn
    cmd.CommandText = "Select * from Table1 where ID=@ID"
    cmd.Parameters.Append cmd.CreateParameter("@ID", adBigInt, adParamInput, 30, myID)
    'cmd.Parameters("@ID").Value = myID
    Dim rst As ADODB.Recordset
    Set rst = cmd.Execute()上述方式連接Access的時候是沒有問題的,但是在連接SQL Server數據庫的情況下,在給參數賦值或者cmd.execute時出錯,說@ID參數沒有聲明。因爲SQL語句需要對用戶保密,所以不能使用存儲過程。那上述的SQL語句怎樣用(怎樣寫,怎樣賦值)才好?

解决方案 »

  1.   

    你这样的语句当然会有问题,分解来看:strSql="Select * from Table1 where ID=@ID"你把这话在VB中间debug.print出来就会看见完全是这么一句话:Select * from Table1 where ID=@ID,你试在isqlw中间运行,识别@ID????
    要么你就在你的sql中间加入一个存储过程,比如是SMConnection
    set cmd=new adodb.Command
    with cmd
        .CommandText = "SMConnection"
        .CommandType = adCmdStoredProc
        .Parameters.Append cmd.CreateParameter("@ID", adBigInt, adParamInput, 30)
        .Parameters("@ID") = myID
         Set cmd.ActiveConnection =Conn'连接
         .Execute
    end with
      

  2.   

    to  daisy8675(莫依):
    20多個小時以來你是第一個回復者.先謝了.我的目的就是识别@ID.需要注意到,上述代碼在connection連接access數據庫時完全沒有問題!
    而且,連接到sql server的時候改為"Select * from Table1 where ID=?"也可以識別問號為參數.用sql server存儲過程沒有這樣的問題,但是現在的需求是:連接到sql server,執行sql語句而不是存儲過程.
    需要說明的是,我的sql語句參數很多,而且都希望用@xxx這樣的字串來閱讀,而不是用問號.太多問號容易弄亂.
    不知道有沒有甚麼寫法可以改良.
      

  3.   

    你是想執行SQL語句不通過存儲過程這個意思?
    怎麼感覺你走了一個彎路啊。
      

  4.   

    不是走了一個彎路,這裡的需求是既定的,就是不希望sql語句寫成存儲過程.因為程序寫完之後要交給客戶單位去維護,不希望對方的數據庫管理人員看到存儲過程裡面的語句,所以決定把語句全部寫到vb代碼中,又希望使用具體的參數名稱來賦值,不希望用問號形式的參數(容易錯位),也不希望用拼字符串的辦法.
      

  5.   

    先准备吃饭,回头我去测试下access再讲。access和sql本身就有差别。
      

  6.   

    先准备吃饭,回头我去测试下access再讲。access和sql本身就有差别。
      

  7.   

    '使用占位符‘?’指定参数化命令字符串
    cmd.CommandText = "Select * from Table1 where ID=?"
    cmd.Parameters.Append cmd.CreateParameter("@ID", adBigInt, adParamInput, 30, myID)
      

  8.   

    真麻烦。
    dim rs as new adodb.recordset
    rs.open "select * from table1 where id=" & id,cnnid是VB程序里的一个变量。
      

  9.   

    以上答案都不合格。
    我的意思再描述一遍:
    原先是数据库访问是用存储过程写的,可以带@ABC这样的命名参数。
    现在我的程序要装到客户机器上,不想让对方的数据库管理员看到我的存储过程(存储过程加密都不可靠)。
    所以我打算吧存储过程的语句直接写到程式中。但是必须带@ABC这样的命名参数。拼接字符串的方法,如“rs.open "select * from table1 where id=" & id,cnn”这样的方法,我n年前就淘汰了,因为对于逗号、引号、回车等特殊字符处理起来有问题。但是使用带参数的存储过程就不会有问题。现在的问题就是在前段用很类似存储过程的语法,不要使用“?”来当占位符,怎么能做到。
    例如: 
        cmd.CommandText = "Select * from Table1 where ID=@ID"
        cmd.Parameters.Append cmd.CreateParameter("@ID", adBigInt, adParamInput, 30, myID)
    当参数多达几十个,并且包含多种特殊字符(甚至可能同时有简体、繁体)的时候,拼字符串的方式就game over了。
      

  10.   

    cmd.CommandText = "declace @ID bigint select @ID=" & myID  & " Select * from Table1 where ID=@ID"
      

  11.   

    zyg0(影子(成功减肥10斤,可给我饿坏了,我要补回来) 的办法倒是有点那么个意思了。
    可惜仍然没有避免使用拼字符串的方法。所以仍然在包含特殊字符(简体、繁体、逗号、引号、回车)时不好处理。
    再改善改善可否?完全避免拼接字符串。
      

  12.   

    我只有这个水平了,没法改进了
    我觉得你说的特殊字符主要需要注意的就是'这个是不允许输入的.可以这样解决
    cmd.CommandText = "declace @ID bigint select @ID='" & myID  & "' Select * from Table1 where ID=@ID"
    1.传入的参数2边+'号 @ID='" & myID  & "' 
    2.myid=replace(myid,"'","''")
    这样'就能完全显示了,其他的字符可以完全全部显示,要屏掉哪个就自己replace拉
    myid=replace(myid,"'","''")
    cmd.CommandText = "declace @ID bigint select @ID='" & myID  & "' Select * from Table1 where ID=@ID"
      

  13.   

    还不如用这个方法:
    比如需要select * from Table1 where id=@id
    则先定义个SQL语句串
    strSQL="select * from Table1 where id=@id"
    然后再用strSQL=Replace(strSQL, "@id", myID)替换一把
    然后再执行该SQL语句,不就可以了?
      

  14.   

    ACCESS中,要用PARAMETERS指定参数才可以吧。而PARAMETERS不能用在SQL数据库中,所以在SQL中恐怕直接用"Select * from Table1 where ID=@ID"这样的语句是不行的。