MS Sql server 可以在一個stored proceduer裡面寫多個命令群
組。
例如:
Create PROCEDURE MyProc;1
as
select * from customer
Go
Create PROCEDURE MyProc;2
as
select * from Order
Go
..........
在每一個stored proceduer命名群組下,我都建立了數十個命令
(最多有40-50個),
但是在ADO.NET下,我卻怎樣也叫不出我的MyProc;1 ,
MyProc;2 ,MyProc;3 , ...... , MyProc;50
請問自家產品怎麼會對自身產品的支援性這麼差,BCB、Delphi都
還可以明確的讀取到所有的stored proceduer。難道是我的用法方
法錯了嗎?
更改我的閱讀文章字型大小大 小
作者 : asupeduer(Asupeduer) [ 貼文 8 | 人氣 1.86 | 評價 0 ] posted on 2/19/2006
3:20:08 AM
[ 回應本文 ] [ 發表新文 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
sqlcommand 使用預存程序群組到底怎麼做?
作者 : light673(吳馨琳) [ 貼文 72 | 人氣 0.28 | 評價 56 ] posted on 2/19/2006 10:17:32
AM
[ 回應本文 ] [ 發表新文 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
這則回應為最佳解答 !! (評價+3) 這則回應很有道理 !!(評價+2)
:::小女子用NorthWind資料的Customers的資料表做測試,預存程序如下:
CREATE PROCEDURE [MyPro;1]
as
select * from customers
GO
假如沒有加括號時,則預存程序的名稱為MyPro,加了括號才是MyPro;1
VB.net程式如下:
Dim cn As New SqlConnection("server=db-machine;database=northwind;user
id=sa;password=sa")
Dim cmd As New SqlCommand()
cmd.CommandType = CommandType.StoredProcedure
cmd.CommandText = "[MyPro;1]"
cmd.Connection = cn
Try
cn.Open()
Dim dr As SqlDataReader =
cmd.ExecuteReader(CommandBehavior.CloseConnection)
Do While dr.Read
Debug.WriteLine(dr("customerid"))
Loop
Catch ex As SqlException
MessageBox.Show(ex.Message)
End Try
請問自家產品怎麼會對自身產品的支援性這麼差 <-------下次有問題時,先想想是不是
你自己的程式有問題,而不要馬上怪產品有問題..........一一|||,抱歉嘿..............^^''
作者 : asupeduer(Asupeduer) [ 貼文 8 | 人氣 1.86 | 評價 0 ] posted on 2/19/2006
3:23:32 PM
[ 回應本文 ] [ 發表新文 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
謝謝您的回應。
但我說的與您說的根本是兩回事
MyProc;1、MyProc;2、MyProc;3這三個是存在於MyProc裡的Stored Proceduer。
[MyProc;1]、[MyProc;2]、[MyProc;3]這三個是完全不同名稱的Stored Proceduer。
第一個寫法是一個Stored Proceduer,裡面有三個命令。
第二個寫法是三個Stored Proceduer,讀取當然沒問題。
另外在MSSQL的定義,所謂的[MyProc;1],意義是因為裡面有關鍵字或保留字,
但是因為命名時又必須命名為此,所以用[]來將該字標示為一個使用者定義物件。
作者 : regionbbs(小朱) [ 貼文 3841 | 人氣 115.06 | 評價 2403 ] posted on 2/19/2006
5:29:35 PM
[ 回應本文 ] [ 發表新文 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
這則回應為最佳解答 !! (評價+3) 這則回應很有道理 !!(評價+2)
那我可否請教一下,你能使用 EXEC 來分別執行指令嗎?
例如你的例子:
Create PROCEDURE MyProc;1
as
select * from customer
Go
Create PROCEDURE MyProc;2
as
select * from Order
Go
請問你可以在 Query Analyzer 中以 EXEC 來個別執行指令嗎?
像是 EXEC MyProc;1, EXEC MyProc;2 之類的?
我測試的結果是,可以使用 EXEC MyProc,但無法使用 EXEC MyProc;1 或 EXEC MyProc;2
ADO.NET 在執行的時候就有如使用 EXEC 指令一樣,所以若 EXEC 做不到的,通常在 ADO.NET 應該也做不到 .
你說 "BCB、Delphi都還可以明確的讀取到所有的stored proceduer",是指 "所有" 還是 "個別" ?
若是個別執行,Borland 是怎麼做到的,那你可能要問問他們的開發團隊,或者 ... 你自己搞錯了也說不定,老實說,我也不知道要怎麼執行一個連 SQL
Server Query Engine 都無法執行的指令 ...
作者 : asupeduer(Asupeduer) [ 貼文 8 | 人氣 1.86 | 評價 0 ] posted on 2/19/2006
10:30:30 PM
[ 回應本文 ] [ 發表新文 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
exec MyProc;1 parameters1,parameters2......
exec MyProc;2 parameters1,parameters2......
我MS SQL 2000 運用Stored Proceduer群組命令功能已經多年。
且用來寫過N個ERP、進銷存等等。
我不知道你怎麼做不出來,且這是MS SQL官方建議的使用Stored Proceduer方法。
作者 : asupeduer(Asupeduer) [ 貼文 8 | 人氣 1.86 | 評價 0 ] posted on 2/19/2006
10:34:44 PM
[ 回應本文 ] [ 發表新文 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
ALTER PROCEDURE dbo.ForFormDUse;1
--宣告動態變數資料
@StartDate Datetime,
@EndDate Datetime
AS
Select Count(*) as Counts From Mail_Details
WHERE (dbo.Mail_Details.Products_Kind <= 2) AND
(dbo.Mail_Details.Mail_method >= 3)
AND (dbo.Mail_Details.MailDate>=@StartDate) AND
(dbo.Mail_Details.MailDate<=DateAdd(second,86399,@EndDate))
ALTER PROCEDURE [dbo].ForFormDUse;2
--宣告動態變數資料
@StartDate Datetime,
@EndDate Datetime
AS
Select Count(*) as Counts From Mail_Details
WHERE (dbo.Mail_Details.Products_Kind >=3) AND
(dbo.Mail_Details.Products_Kind <=4) AND
(dbo.Mail_Details.Mail_method >= 3)
AND (dbo.Mail_Details.MailDate>=@StartDate) AND
(dbo.Mail_Details.MailDate<=DateAdd(second,86399,@EndDate))
AND (dbo.Mail_Details.Mail_No=1)
ALTER PROCEDURE [dbo].ForFormDUse;3
--宣告動態變數資料
@StartDate Datetime,
@EndDate Datetime
AS
Select Count(*) as Counts From Mail_Details
WHERE (dbo.Mail_Details.Products_Kind >=3) AND
(dbo.Mail_Details.Products_Kind <=4) AND
(dbo.Mail_Details.Mail_method >= 3)
AND (dbo.Mail_Details.MailDate>=@StartDate) AND
(dbo.Mail_Details.MailDate<=DateAdd(second,86399,@EndDate))
AND (dbo.Mail_Details.Mail_No<>1)
作者 : asupeduer(Asupeduer) [ 貼文 8 | 人氣 1.86 | 評價 0 ] posted on 2/19/2006
10:37:34 PM
[ 回應本文 ] [ 發表新文 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
如果ADO.NET無法支援多重預存程序群組,那我敢說,是一個超級大BUG。
因為其他前端Client開發平台,我還沒看過無法存取的。
BCB、Delphi、QT......
作者 : asupeduer(Asupeduer) [ 貼文 8 | 人氣 1.86 | 評價 0 ] posted on 2/19/2006
11:04:53 PM
[ 回應本文 ] [ 發表新文 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
如果您不知道您的資料庫內,到底有多少Stored Proceduer,你可以執行下列命令。
--列出某一資料庫內所有Stored Proceduer清單
exec [資料庫名稱]..sp_procedures_rowset;2 NULL
你可以依照我示範的方法,先建立一個多重預存程序群組,然後用這個命令來
查詢自己的資料庫內,有多少預存程序,就可以看到,你建立的多重預存程序群組,
已經分成多個命令MyProc;1、MyProc;2、MyProc;3,列在你剛才執行查詢的
sp_proceduers命令所列出的Stored Proceduer清單中。
可是呢:
ADO.NET卻用了一串又臭又長又錯誤的命令來獲取Stored Proceduer清單。
他的取法卻沒有取到正確的Stored Proceduer清單
SELECT
db_name() AS [Database_Name],
sp.name AS [Name],
ssp.name AS [Schema],
sp.id AS [ID],
CAST(
CASE WHEN (OBJECTPROPERTY(sp.id, N'IsMSShipped')=1) THEN 1 WHEN 1 =
OBJECTPROPERTY(sp.id, N'IsSystemTable') THEN 1 ELSE 0 END
AS bit) AS [IsSystemObject],
CAST((SELECT TOP 1 encrypted FROM dbo.syscomments p WHERE sp.id = p.id AND
p.colid=1 and p.number < 2) AS bit) AS [IsEncrypted]
FROM
dbo.sysobjects AS sp
INNER JOIN sysusers AS ssp ON ssp.uid = sp.uid
WHERE
(sp.xtype = N'P' OR sp.xtype = N'RF')
ORDER BY
[Database_Name] ASC,[Schema] ASC,[Name] ASC
人家Delphi只用一行MS SQL的內建指令來獲取Stored Proceduer清單,ADO.NET卻用錯誤的笨方法又把命令寫的又臭又長,可見
ADO.NET開發團隊還要加油啊。