mohamad_ali Ответов: 2

Хранить процедуру, а не значение retern


привет в моем проекте проблема когда я хочу прочитать запись с помощью sql datareader

Что я уже пробовал:

using (SqlConnection mysqlConnection = new SqlConnection(this.database.getConnectionString()))
         {



             using (SqlCommand mySqlCommand = new SqlCommand("GetDboName", mysqlConnection))
             {
                 mySqlCommand.CommandType = CommandType.StoredProcedure;

                 mySqlCommand.Parameters.AddWithValue("@Imei", imei);
                 mysqlConnection.Open();




                 using (SqlDataReader mySqlDataReader = mySqlCommand.ExecuteReader())
                     {
                         if (!mySqlDataReader.HasRows)
                         {
                             throw new QueryException(1, "Tracker " + imei + " is not registered.");
                         }
                         else
                         {
                             mySqlDataReader.Read();







                         }
                     }


                 //mysqlConnection.Close();

             }

         }






declare @imei nvarchar(100)=869170031585095
DECLARE @DatabaseName NVARCHAR(MAX)=null, @SQL NVARCHAR(MAX);


select  @DatabaseName= DboName  from [CentralRelation].[dbo].[TrackingMaster] where Imei=869170031585095


SET @SQL = N'USE ' + QUOTENAME(@DatabaseName) +'  SELECT dbo.LastLogDevice.time, dbo.Carrier.carrierID, dbo.Carrier.carrierTypeFId, dbo.Carrier.companyFId, dbo.Carrier.orgFId, dbo.Carrier.fleetFid, dbo.Carrier.carrierName, dbo.Carrier.carreiernameonmap,
                         dbo.Carrier.deviceImei, dbo.Carrier.displayorhidenonmap, dbo.Carrier.zoneFId, dbo.Carrier.SimNumber, dbo.Carrier.Status, dbo.Carrier.PelackNumber, dbo.Carrier.apnName, dbo.Carrier.apnUserName,
                         dbo.Carrier.apnPassword, dbo.Carrier.createdOn, dbo.Carrier.expiresOn, dbo.Carrier.Lastedit ,(select   CompanyName  from [CentralAlcazer].[dbo].[Tracker] as t1 where t1.DeviceImei='+@imei+') as dboname
                           FROM dbo.Carrier INNER JOIN 
                          dbo.LastLogDevice ON dbo.Carrier.carrierID = dbo.LastLogDevice.carrierFId 
                          WHERE(dbo.Carrier.deviceImei ='+ @imei+') AND(dbo.Carrier.createdOn < GETDATE()) AND(dbo.Carrier.expiresOn > GETDATE())  AND(dbo.Carrier.Status = 1)';

--PRINT(@SQL);


EXECUTE(@SQL);

F-ES Sitecore

А что у тебя за вопрос?

2 Ответов

Рейтинг:
20

OriginalGriff

Таким образом, он не возвращает никаких значений - почти наверняка это потому, что ваше предложение WHERE не находит совпадений.

Проверьте свой SP в SSMS и посмотрите, что он возвращает, когда вы даете ему определенные значения. Когда вы будете счастливы, что это работает, то используйте отладчик C#, чтобы точно узнать, что вы передаете в SQL, и сравните это со значениями, которые работали в SSMS.

Мы ничего не можем сделать для вас - у нас нет доступа к вашим данным.


mohamad_ali

его работа в ssms и передача правильного параметра, но не повторный результат exexute string

Рейтинг:
2

phil.o

Вы должны сделать что-то с тем, что Вы читаете, поместить его в переменную для последующего использования или вывести его непосредственно, например.

if (mySqlDataReader.HasRows)
{
   mySqlDataReader.Read();
   string value = ((IDataRecord)mySqlDataReader)[0];
}
else
{
   // No record found. Act accordingly.
}

Edit: вот что вы могли бы попробовать (избегая использования AddWithValue() метод явного указания типа параметра):
mySqlCommand.Parameters.Add("@imei", SqlDbType.NVarChar).Value = imei;

Кроме того, в вашей хранимой процедуре есть недостаток: вы не используете параметр imei для выбора имени базы данных; поэтому выбранное имя базы данных является статическим (поскольку основано на статическом значении 869170031585095), тогда как второй запрос использует этот параметр.
SELECT @DatabaseName= DboName  from [CentralRelation].[dbo].[TrackingMaster] WHERE Imei = @imei;


mohamad_ali

результат HasRows является ложным, но запрос имеет результат в ssms

phil.o

Пожалуйста, смотрите мой обновленный ответ.

F-ES Sitecore

попробуй поставить

УСТАНОВИТЕ NOCOUNT ON

в верхней части СП

mohamad_ali

thnx для вашего ответа, моя проблема решена ,