powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / не понимаю, почему всегда возвращается одна запись из БД(прошу help, сделать давно немогу)
8 сообщений из 8, страница 1 из 1
не понимаю, почему всегда возвращается одна запись из БД(прошу help, сделать давно немогу)
    #34727097
Фотография FasterHarder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
I started in 1983, in 2007 i still on a case!

Всем программистам привет! Respect! В общем появилась проблемка, связанная с получением нужного количества записей от БД. Есть у меня такой код, откуда идет вызов функции из Dll:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
sql_dataRdr = ReturnsCountRecord.GET_DATA_FROM_DATAREADER_WITH_ANY_PARAMETERS(sql_connString, ref sql_param,
                        CommandType.StoredProcedure, ref exep, "GET_IMAGE_DEPENDS_ON_CHECKED_ELEMENT");
            if (exep != null)
            {
                MessageBox.Show(exep.Message);
                MessageBox.Show(exep.Source.ToString());
                MessageBox.Show(exep.TargetSite.ToString());
            }
            else
            {
                int k =  0 ;
                while (sql_dataRdr.Read())
                {
                    byte[] bit = sql_dataRdr.GetSqlBinary( 1 ).Value;
                    MemoryStream ms = new MemoryStream(bit,  0 , bit.Length);
                    bmp = (Bitmap)Bitmap.FromStream(ms);
                    //Graphics gr_frame = panel2.Controls[k].CreateGraphics();
                    //PictureBox pb = (PictureBox)panel2.Controls[k];
                    //Graphics gr_frame = pb.CreateGraphics();
                }
            }

Функция в DLL GET_DATA_FROM_DATAREADER_WITH_ANY_PARAMETERS имеет вид:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
//=============================================================================
        // Намерение: получить все наиболее свежие данные на каждую конкретную камеру
        //=============================================================================
        public static SqlDataReader GET_DATA_FROM_DATAREADER_WITH_ANY_PARAMETERS(string sql_connectString, ref SqlParameter[] Param,
            CommandType SQLCmdType, ref Exception e, string sql_nameStoredProcedure)
        {
            string str_param = "'";  // Намерение: сформировать строку, состоящую из перечисления параметров         
            SqlDataReader sql_dataReader;
            SqlConnection sql_conn = new SqlConnection(sql_connectString);
            SqlCommand sql_cmd = new SqlCommand(sql_nameStoredProcedure, sql_conn);
            sql_cmd.CommandType = SQLCmdType;

            // Add any parameters
            if (Param != null)
            {
                foreach (SqlParameter tempLoopVar_ParamTemp in Param)
                {
                    str_param = str_param + tempLoopVar_ParamTemp.Value + "','";                   
                }
            }
            // Open the connection
            try
            {
                string str_paramFinish = str_param.Substring( 0 , (str_param.Length -  2 )); // конечная строка, состоящая из параметров
                SqlParameter param = new SqlParameter();
                param.ParameterName = "@LID";
                param.SqlDbType = SqlDbType.NVarChar;
                param.Value = str_paramFinish;               
                sql_cmd.Parameters.Add(param);
                sql_conn.Open();
                //Намерение: принудительно сменить имя нужной базы данных, если вдруг установлена случаем другая
                sql_conn.ChangeDatabase("?????");
                sql_dataReader = sql_cmd.ExecuteReader(CommandBehavior.CloseConnection);
                return sql_dataReader;
            }
            catch (Exception ex)
            {
                // Намерение: вернуть исключение в клиентский код
                e = ex;
                return null;
            }
        }
        //=============================================================================
        //=============================================================================

и соответственно сама хранимка GET_IMAGE_DEPENDS_ON_CHECKED_ELEMENT на сервере имеет вид:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
ALTER PROCEDURE [dbo].[GET_IMAGE_DEPENDS_ON_CHECKED_ELEMENT]
@LID NVARCHAR( 400 )
AS
BEGIN
	-- SET NOCOUNT ON added to prevent extra result sets from
	-- interfering with SELECT statements.
SET NOCOUNT ON;
DECLARE @SQLCMD NVARCHAR( 2000 )
SET @SQLCMD = 'SELECT LID, BYTES FROM VID_DATA WHERE ( SID IN (' + @LID + ')' + 'AND
				DATA = (SELECT MAX(DATA) AS DATA1 FROM VID_DATA WHERE SID IN (' + @LID + ')))';
EXECUTE SP_EXECUTESQL  @SQLCMD	
END

и мне возвращается всегда одна запись, это я проверяю на sql_drd.read(). Если поменять запрос в ХП на
Код: plaintext
SET @SQLCMD = 'SELECT LID, BYTES FROM VID_DATA WHERE  SID IN (' + @LID + ')' 
то получаю то, что хочу, но все записи, удовлетворяющие условию, а мне необходимо только самые свежие(с максимальной датой). На что грешить незнаю, уже начинаю нервничать, что ничего не получается, а главное непонятно в чем разбираться.

Решил проверить запрос 'SELECT LID, BYTES FROM VID_DATA WHERE ( SID IN (' + @LID + ')' + 'AND
DATA = (SELECT MAX(DATA) AS DATA1 FROM VID_DATA WHERE
на тестовых данных:
Код: plaintext
1.
2.
3.
4.
5.
6.
create table test( a int , b int );

insert into test values(  4 ,  5 );

select * from test;

select a, b from test where( a in (  2 , 4  ) and  b = (select max(b) as b from test where a in (  2 , 4 )));

и получил то, что необходимо получить от программы, т е такого плана запрос мне и нужен(см. файл):

в отладчике все проверяю, и вижу, что строка :
Код: plaintext
  string str_paramFinish = str_param.Substring( 0 , (str_param.Length -  2 )); // конечная 
формируется верно.
В общем непонимаю, почему хранимка всегда возвращает одну запись, хотя количество возвращаемых записей должно быть равно количеству передаваемых параметров. Подскажите как быть то? , буду безмерно благодарен.
...
Рейтинг: 0 / 0
не понимаю, почему всегда возвращается одна запись из БД(прошу help, сделать давно немогу)
    #34727131
Фотография Нахлобуч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FasterHarderВ общем непонимаю, почему хранимка всегда возвращает одну запись, хотя количество возвращаемых записей должно быть равно количеству передаваемых параметров. Подскажите как быть то? , буду безмерно благодарен.
Сколько букоф, однако...

Вот такой запрос
Код: plaintext
1.
2.
'SELECT LID, BYTES FROM VID_DATA WHERE ( SID IN (' + @LID + ')' + 
    'AND DATA = (SELECT MAX(DATA) AS DATA1 FROM VID_DATA WHERE SID IN (' + @LID + ')))
...
Рейтинг: 0 / 0
не понимаю, почему всегда возвращается одна запись из БД(прошу help, сделать давно немогу)
    #34727146
Фотография Нахлобуч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сорвалось, однако.

Так вот. Вышеупомянутый запрос вам вернет все строки с датой обновления, равной максимальной из дат обновления записей с заданными идентификаторами. Вам, скорее всего, стоит переписать запрос как-то так:

Код: plaintext
1.
2.
select distinct ... from VID_DATA where SID in ...
order by DATA desc
...
Рейтинг: 0 / 0
не понимаю, почему всегда возвращается одна запись из БД(прошу help, сделать давно немогу)
    #34727170
Фотография FasterHarder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
I started in 1983, in 2007 i still on a case!

Спасибо Нахлобуч за помощь, сейчас попробую твой вариант, но если посмотреть на приложенный файл(в первом сообщении), то там получается то, что мне необходимо получить от приложения, т е запрос типа:
Код: plaintext
select a, b from test where( a in (  2 , 4  ) and  b = (select max(b) as b from test where a in (  2 , 4 )));
именно выбирает так как необходимо, другое дело, что я как то неккоректно его записал для кода приложения.
...
Рейтинг: 0 / 0
не понимаю, почему всегда возвращается одна запись из БД(прошу help, сделать давно немогу)
    #34727214
Фотография FasterHarder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
I started in 1983, in 2007 i still on a case!

только сейчас дошло, что вариант с DISTINCT не катит, т к мне необходимо выбирать гуид таблицы, а оно уникальный. А если его выбирать, то вернуться все записи из таблы попадающие под фильтр, иначе ловлю ошибку от сервера:
авторСообщение 145, уровень 15, состояние 1, строка 1
Элементы ORDER BY должны входить в список выбора, если указывается SELECT DISTINCT.
но это и понятно.
...
Рейтинг: 0 / 0
не понимаю, почему всегда возвращается одна запись из БД(прошу help, сделать давно немогу)
    #34727603
Фотография Нахлобуч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проверьте что ли запрос.. У вас там всякие SID-LID. Именовали бы столбцы по-человечески.
...
Рейтинг: 0 / 0
не понимаю, почему всегда возвращается одна запись из БД(прошу help, сделать давно немогу)
    #34727648
Фотография FasterHarder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
I started in 1983, in 2007 i still on a case!

НахлобучПроверьте что ли запрос.. У вас там всякие SID-LID. Именовали бы столбцы по-человечески.

девяносто девять пудов дело в запросе, правильный ответ уже обсуждаю на другой ветке. А что касается наименований, то эта база и все остальное осталось в наследство от другого проггера, которого выгнали с работы через 3 месяца ибо плохо писал код, как говорит шеф:), а делать рефакторинг всякий разный некогда, недожиру как говориться быть живу ибо и так делов полно, несколько прог с vb на диез переписывать:).
...
Рейтинг: 0 / 0
не понимаю, почему всегда возвращается одна запись из БД(прошу help, сделать давно немогу)
    #34728577
Фотография FasterHarder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
I started in 1983, in 2007 i still on a case!


ДА, ДЕЛО БЫЛО В ЗАПРОСЕ. ПЕРЕПИСАВ ЗАПРОС В ХП ТАК КАК ПОКАЗАНО НИЖЕ ВСЕ ЗАФУРЫЧИЛО КАК И ПРЕДПОЛАГАЛОСЬ. ВСЕМ СПАСИБО ЗА HELP. TOP CLOSE.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
USE [????]
GO
/****** Объект:  StoredProcedure [dbo].[GET_IMAGE_DEPENDS_ON_CHECKED_ELEMENT]    Дата сценария: 08/15/2007 10:36:18 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:		< ???????????>
-- Create date: < 6 АВГУСТА 2007 >
-- Description:	< ДАННАЯ ХП ВОЗВРАЩАЕТ КАЖДЫЙ РАЗ НЕОПРЕДЕЛЕННОЕ КОЛИЧЕСТВО ЗАПИСЕЙ В ЗАВИСИМОСТИ ОТ КОЛИЧЕСТВА ПЕРЕДАННЫХ ПАРАМЕТРОВ >
-- =============================================
ALTER PROCEDURE [dbo].[GET_IMAGE_DEPENDS_ON_CHECKED_ELEMENT]
@LID NVARCHAR( 400 )
AS
BEGIN
	-- SET NOCOUNT ON added to prevent extra result sets from
	-- interfering with SELECT statements.
SET NOCOUNT ON;
DECLARE @SQLCMD NVARCHAR( 2000 )
SET @SQLCMD = 'SELECT VID_DATA.LID, MIDLE_RESULT.SID, VID_DATA.DATA, VID_DATA.BYTES FROM 
	( SELECT VID_DATA.SID, MAX(VID_DATA.DATA) AS MAX_DATA FROM VID_DATA
		WHERE VID_DATA.SID IN (' + @LID + ') GROUP BY VID_DATA.SID ) MIDLE_RESULT
		INNER JOIN VID_DATA ON MIDLE_RESULT.SID = VID_DATA.SID AND MIDLE_RESULT.MAX_DATA = VID_DATA.DATA';
EXECUTE SP_EXECUTESQL  @SQLCMD	
END
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / не понимаю, почему всегда возвращается одна запись из БД(прошу help, сделать давно немогу)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]