這有點複雜,但歸結爲Python成功地拉動了數據,而C#則沒有。ODBC:Python獲取數據,C#不是有時?
這是位於遠程服務器(Plexus)上的存儲過程中的SQL。
語句1:
SELECT DISTINCT
CC.Serial_No,
CC.Part_Operation_Key
INTO #Regrades
FROM Part_v_Container_Change2 AS CC
SELECT COUNT(*) FROM #Regrades
DROP TABLE #Regrades
RETURN;
這雙方C#和Python運行成功。當我添加一個連接時,C#不再提取任何記錄,而是Python。即
聲明2:
SELECT DISTINCT
CC.Serial_No,
CC.Part_Operation_Key,
PO.Operation_Key
INTO #Regrades
FROM Part_v_Container_Change2 AS CC
JOIN Part_v_Part_Operation AS PO
ON PO.Part_Operation_Key = CC.Part_Operation_Key
SELECT COUNT(*) FROM #Regrades
DROP TABLE #Regrades
RETURN;
它變得有點怪異,但。通過玩它,我發現它可能與臨時桌有關。如果我做了一個選擇並且不創建這個臨時表,那麼這兩個程序都會成功地提取數據(我需要這個臨時表供以後分析)。
因此,我認爲我應該使用下面顯示的創建和插入。
聲明3:
CREATE TABLE #Test
(
Serial_No NVARCHAR(50),
Part_Operation_Key INT,
Operation_Key INT
);
INSERT #Test
(
Serial_No,
Part_Operation_Key,
Operation_Key
)
SELECT DISTINCT
CC.Serial_No,
CC.Part_Operation_Key,
PO.Operation_Key
FROM Part_v_Container_Change2 AS CC
JOIN Part_v_Part_Operation AS PO
ON PO.Part_Operation_Key = CC.Part_Operation_Key
WHERE PO.Operation_Key = 32603 OR
PO.Operation_Key = 33529;
SELECT COUNT(*) FROM #Test
DROP TABLE #Test
RETURN;
現在這裏是踢球。這在C#中失敗了,但是在Python中起作用。但是,當我測試時,我在同一個存儲過程中同時使用了語句2和3。如果我註釋掉statement2,然後註釋掉statement3,statement3每次都在C#中運行。這也是相反的。
這裏是C#的代碼。我把它放到一個控制檯應用程序中,以確保程序中沒有其他東西導致問題。
C#
static void Main(string[] args)
{
using (OdbcConnection connectionScalar = new OdbcConnection("DSN=XXXX; UID=XXXX; PWD=XXXX;"))
{
connectionScalar.Open();
using (OdbcCommand command = new OdbcCommand("sproc164407_2053096_650810", connectionScalar))
{
command.CommandType = CommandType.StoredProcedure;
var count = command.ExecuteScalar();
Console.WriteLine(count);
Console.WriteLine("Complete");
Console.ReadLine();
}
}
}
的Python
queryString = "{call sproc164407_2053096_650810()}"
connection = pyodbc.connect('DSN=xxxx; UID=xxxx; PWD=xxxx', autocommit = True)
cursor = connection.cursor()
cursor.execute(queryString)
recs=cursor.fetchall()
print(recs)
Python的作品每次。如果任何人都能指出我發生什麼問題的方向,或者我能做些什麼來改變這一點,那將是非常棒的!我可以運行python腳本,但是我不知道問題是什麼。
您的會話設置在兩者之間是否有所不同?比如ANSI_NULLS可以影響查詢的處理方式。知道這一點的一個啓發是,在該過程的計劃緩存中是否有多個查詢計劃。更強大的方法是編寫一個過程,從sessionproperty函數中選擇並返回所有可用的值。 –
Ben你知道我怎麼會發現這一點我不是數據庫中任何方式的專家。 – Danrex
就像我上面說過的,嘗試編寫一個程序來處理像'選擇會話屬性('ansi_nulls')'ansi_nulls',會話屬性('ansi_padding')作爲'ansi_padding',...'然後從你的應用程序調用它(或者具有相同設置的一個)。如果您正在使用DBA,他們應該能夠幫助您至少編寫過程。 –