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脚本,但不知道问题是什么对我来说不是很满意。
尝试将SET NOCOUNT ON;
添加为进程中的第一条语句。这将抑制DONE_IN_PROC
消息(rowcount),这会混淆一些api。
我不认为你在c#中使用。net Provider for SQL Server (SqlClient)会有这个问题,而且它会比托管coe中的ODBC表现得更好。