ODBC:Python获取数据,C#不是......有时候?

时间:2015-10-07 03:26:45

标签: c# python sql-server stored-procedures 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;

虽然有点怪异。通过玩它,我发现它可能与临时表有关。如果我执行select并且不创建此临时表,则两个程序都会成功提取数据(我需要此临时表以供稍后分析)。

因此我认为我应该使用如下所示的创建和插入。

声明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脚本,但不知道问题是什么我不是很满意。

1 个答案:

答案 0 :(得分:0)

尝试添加SET NOCOUNT ON;作为proc中的第一个语句。这将禁止可能混淆某些API的DONE_IN_PROC消息(行计数)。

我认为你不会在C#中使用SQL Server的.NET提供程序(SqlClient)存在问题,并且它将比来自managed coe的ODBC表现更好。