用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語句怎樣用(怎樣寫,怎樣賦值)才好?
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語句怎樣用(怎樣寫,怎樣賦值)才好?
要么你就在你的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
20多個小時以來你是第一個回復者.先謝了.我的目的就是识别@ID.需要注意到,上述代碼在connection連接access數據庫時完全沒有問題!
而且,連接到sql server的時候改為"Select * from Table1 where ID=?"也可以識別問號為參數.用sql server存儲過程沒有這樣的問題,但是現在的需求是:連接到sql server,執行sql語句而不是存儲過程.
需要說明的是,我的sql語句參數很多,而且都希望用@xxx這樣的字串來閱讀,而不是用問號.太多問號容易弄亂.
不知道有沒有甚麼寫法可以改良.
怎麼感覺你走了一個彎路啊。
cmd.CommandText = "Select * from Table1 where ID=?"
cmd.Parameters.Append cmd.CreateParameter("@ID", adBigInt, adParamInput, 30, myID)
dim rs as new adodb.recordset
rs.open "select * from table1 where id=" & id,cnnid是VB程序里的一个变量。
我的意思再描述一遍:
原先是数据库访问是用存储过程写的,可以带@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了。
可惜仍然没有避免使用拼字符串的方法。所以仍然在包含特殊字符(简体、繁体、逗号、引号、回车)时不好处理。
再改善改善可否?完全避免拼接字符串。
我觉得你说的特殊字符主要需要注意的就是'这个是不允许输入的.可以这样解决
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"
比如需要select * from Table1 where id=@id
则先定义个SQL语句串
strSQL="select * from Table1 where id=@id"
然后再用strSQL=Replace(strSQL, "@id", myID)替换一把
然后再执行该SQL语句,不就可以了?