Это немного сложнее, но сводится к тому, что Python успешно вытягивает данные, а C# - нет.ODBC: Python получает данные, C# doesn't..sometimes?
Вот SQL, который находится внутри хранимого процесса, который находится на удаленном сервере (Plexus).
заявлении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, а затем раскомментировал инструкцию 3, 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, но мне не очень приятно не знать, в чем проблема.
Ваши настройки сеанса отличаются между двумя? Такие вещи, как ANSI_NULLS, могут влиять на обработку запросов. Одна эвристика, чтобы знать это, заключается в том, существует ли более чем один план запроса в кеше плана для этой процедуры. Более грубым способом было бы написать процедуру, которая выбирает и возвращает эти значения из всего, что вы можете, из функции sessionproperty. –
Бен вы знаете, как я это узнаю, я не специалист в каких-либо средствах в базах данных. – Danrex
Как я уже сказал выше, попробуйте написать процедуру, которая делает такие вещи, как 'select sessionproperty ('ansi_nulls') как 'ansi_nulls', sessionproperty ('ansi_padding') как 'ansi_padding', ...', а затем вызывает это из вашего приложения (или один с той же настройкой). Если вы работаете с администратором баз данных, они должны помочь вам хотя бы написать процедуру. –