2015-10-07 2 views
0

Это немного сложнее, но сводится к тому, что 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, но мне не очень приятно не знать, в чем проблема.

+0

Ваши настройки сеанса отличаются между двумя? Такие вещи, как ANSI_NULLS, могут влиять на обработку запросов. Одна эвристика, чтобы знать это, заключается в том, существует ли более чем один план запроса в кеше плана для этой процедуры. Более грубым способом было бы написать процедуру, которая выбирает и возвращает эти значения из всего, что вы можете, из функции sessionproperty. –

+0

Бен вы знаете, как я это узнаю, я не специалист в каких-либо средствах в базах данных. – Danrex

+0

Как я уже сказал выше, попробуйте написать процедуру, которая делает такие вещи, как 'select sessionproperty ('ansi_nulls') как 'ansi_nulls', sessionproperty ('ansi_padding') как 'ansi_padding', ...', а затем вызывает это из вашего приложения (или один с той же настройкой). Если вы работаете с администратором баз данных, они должны помочь вам хотя бы написать процедуру. –

ответ

0

Попробуйте добавить SET NOCOUNT ON; в качестве первого утверждения в proc. Это приведет к подавлению DONE_IN_PROC сообщений (rowcounts), которые могут запутать некоторые API.

Я не думаю, что у вас возникнет проблема в C# с .NET Provider для SQL Server (SqlClient), и он будет работать лучше, чем ODBC от управляемого coe.

+0

На самом деле у меня есть этот набор. Я должен был показать это, но это было прямо на вершине моего sql. – Danrex

Смежные вопросы