2015-12-10 3 views
1

Я пытаюсь получить почтовый индекс из базы данных, и я написал хранимую процедуру, как этотC не возвращает результаты

[dbo].[p_SearchZipLocal] 
    @zip nvarchar(10) = NULL, 
    @city nvarchar(100) = null 
AS 
BEGIN 
    SET NOCOUNT ON; 

    BEGIN 
     -- Verifica se o zip aparece na primeira coluna 
     IF((SELECT COUNT(cttzip) 
      FROM seur 
      WHERE cttzip = @zip) > 0) 
     BEGIN 
      -- Verifica se o valor é NA, se não for devolve o zip e a localidade correcta 
      IF((SELECT TOP(1) [SubCity1] as city 
       FROM seur 
       WHERE cttzip = @zip) = '#N/A') 
      BEGIN 
       -- Se for NA vamos ter de pesquisar na quinta coluna pela localidade 
       IF((SELECT count(*) FROM seur WHERE subCity2 LIKE @city + '%')>0) 
        -- Se encontrar-mos devolvemos o novo zip 
        SELECT TOP(1) 
         '0' AS Error, subZip2 as zip, subCity2 AS city 
        FROM seur 
        WHERE subCity2 LIKE @city + '%' 
       ELSE 
        SELECT 
         '2' AS Error, 'Erro' AS zip, 'Erro' AS city 
       END 
      ELSE 
       SELECT TOP(1) 
        '0' AS Error, cttzip AS zip, [SubCity1] as city 
       FROM seur 
       WHERE cttzip = @zip 
     END 
    ELSE 
     SELECT '1' AS Error, 'Erro' AS zip, 'Erro' AS city 
    END 
END 

Вернувшиеся результаты при выполнении с SQL Server например:

0 9900 AEROPORTO DA HORTA 

Но когда я называю это кодом C#, он не возвращает результаты в datatable.

using (SqlCommand cmd = new SqlCommand("p_SearchZipLocal", connectionSQL)) 
{ 
    cmd.CommandType = CommandType.StoredProcedure; 

    cmd.Parameters.Add("@zip", SqlDbType.VarChar).Value = "9900"; 
    cmd.Parameters.Add("@city", SqlDbType.VarChar).Value = "PRAIA DO ALMOXARIFE"; 

    connectionSQL.Open(); 

    DataTable dt = new DataTable(); 
    dt.Load(cmd.ExecuteReader()); 
} 

Этот код получает имена столбцов в обратном, но нет никакого значения. Может ли кто-нибудь сказать мне, где мой код неправильный?

+0

Маленький совет, в ваших 'if' проверках, вместо того, чтобы делать'> 0' или 'TOP (1) ... =' use 'Exists (' это приведет к более быстрым запросам. [Вот ваш переведённый код переписан использовать его] (https://gist.github.com/anonymous/acf29262b062f9071965). Также ваш раздел 'SELECT TOP (1)', который, я думаю, ошибочен, вы делаете верхнюю 1 без порядка, по которой, вероятно, будет ошибка Вы, вероятно, хотели, чтобы там существовал другой (что я сделал в примере, к которому я привязался) –

+0

Ваш код работал хорошо с некоторой тонкой настройкой. Спасибо за помощь – Lucky

ответ

1

Я хотел бы использовать .Нанести с DataAdapter

Пожалуйста, смотрите это ...

DataTable.Load(FbDataReader) does not load everything into DataTable

+0

Проблема не решена. Я думаю, что данные не переходят из sql хранимая процедура -> C# – Lucky

+0

Можете ли вы попробовать что-то вроде этого? // комментируйте dt.Load (cmd.ExecuteReader()), затем добавьте это: SqlDataReader myReader = cmd.ExecuteReader (CommandBehavior.CloseConnection); while (myReader.Read()) { Console.WriteLine (myReader ["city"]); } myReader.Close(); – FormulaChris

+0

Решенный с небольшим количеством каждого наконечника. Спасибо за помощь – Lucky

1

DataTable.Load метод ожидает столбец первичного ключа в исходных данных (то есть от DataReader). Похоже, ваша процедура не имеет ни одного столбца первичного ключа, либо если у вас есть один пользователь order by в sql-заявлении и попытайтесь сохранить его как первый столбец, чтобы DataTable смог принять его как первичный.

Это очень старая проблема с DataTable.Load и не очень хорошо документирована. Обычно SQLDataAdapter хорош с DataTable.

+0

Я не уверен, была ли проблема напрямую связана с не возвращением первичного ключа, но это была одна из вещей, которые я добавил к окончательному решению. Спасибо за помощь – Lucky

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