这有点复杂,但归结为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脚本,但不知道问题是什么我不是很满意。
答案 0 :(得分:0)
尝试添加SET NOCOUNT ON;
作为proc中的第一个语句。这将禁止可能混淆某些API的DONE_IN_PROC
消息(行计数)。
我认为你不会在C#中使用SQL Server的.NET提供程序(SqlClient)存在问题,并且它将比来自managed coe的ODBC表现更好。