2015-10-07 26 views
0

這有點複雜,但歸結爲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腳本,但是我不知道問題是什麼。

+0

您的會話設置在兩者之間是否有所不同?比如ANSI_NULLS可以影響查詢的處理方式。知道這一點的一個啓發是,在該過程的計劃緩存中是否有多個查詢計劃。更強大的方法是編寫一個過程,從sessionproperty函數中選擇並返回所有可用的值。 –

+0

Ben你知道我怎麼會發現這一點我不是數據庫中任何方式的專家。 – Danrex

+0

就像我上面說過的,嘗試編寫一個程序來處理像'選擇會話屬性('ansi_nulls')'ansi_nulls',會話屬性('ansi_padding')作爲'ansi_padding',...'然後從你的應用程序調用它(或者具有相同設置的一個)。如果您正在使用DBA,他們應該能夠幫助您至少編寫過程。 –

回答

0

嘗試添加SET NOCOUNT ON;作爲proc中的第一條語句。這會壓制DONE_IN_PROC消息(行計數),這些消息可能會混淆某些API。

我不認爲你會在C#中使用.NET Server Provider for SQL Server(SqlClient)時遇到問題,它將比來自managed coe的ODBC執行得更好。

+0

我其實已經設置了。我應該已經證明了這一點,但它在我的sql的頂部是正確的。 – Danrex