ODBC: Python可以获取数据,c#有时不能

本文关键字:不能 数据 获取 Python ODBC | 更新日期: 2023-09-27 18:16:16

这有点复杂,但归结为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做。例如

Statement2:

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;

事情变得更奇怪了。通过玩它,我发现它可能与临时表有关。如果我执行一个选择并且不创建这个临时表,那么两个程序都可以成功地提取数据(但是我需要这个临时表用于以后的分析)。

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

Statement3:

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

ODBC: Python可以获取数据,c#有时不能

尝试将SET NOCOUNT ON;添加为进程中的第一条语句。这将抑制DONE_IN_PROC消息(rowcount),这会混淆一些api。

我不认为你在c#中使用。net Provider for SQL Server (SqlClient)会有这个问题,而且它会比托管coe中的ODBC表现得更好。