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

Всем программистам привет! Respect! Столкнулся с одной проблемкой, в общем суть такова: формирую динамически массив, состоящий из элементов в диапазоне [1..9](т е количество варьируется и за ранее неизвестно, но максимум может быть девять элементов). Это айдишники некой таблицы на сервере типа GUID. Теперь из клиента я вызываю библиотечную фунцию типа :

Код: 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.
 //===========================================================================
        public static SqlDataReader GET_DATA_FROM_DATAREADER(string sql_connectString, ref SqlParameter[] Param,
            CommandType SQLCmdType, ref Exception e, string sql_nameStoredProcedure)
        {
            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)
            {
                SqlParameter sql_parm;

                foreach (SqlParameter tempLoopVar_ParamTemp in Param)
                {
                    sql_parm = tempLoopVar_ParamTemp;
                    sql_cmd.Parameters.Add(sql_parm);
                }
            }
            // Open the connection
            try
            {
                sql_conn.Open();
                //Намерение: принудительно сменить имя нужной базы данных
                sql_conn.ChangeDatabase("...");
                sql_dataReader = sql_cmd.ExecuteReader(CommandBehavior.CloseConnection);
                return sql_dataReader;
            }
            catch (Exception ex)
            {
                // Намерение: вернуть исключение в клиентский код
                e = ex;
                return null;
            }            
        }
        //========================================================================
Это универсальная функция, используемая всем приложением, но раньше четко было известно количесвто передаваемых параметров:).

и как видно, что один из параметров это массив SqlParameters. Допустим я сформирую массив параметров на клиенте и передам в эту функцию. Данная функция их обработает и необходимо запустить нужную ХП на сервере( запрос должен как я понимаю быть типа SELECT UID, IMAGE FROM TABLE WHERE UID IN ( ...,...,...,...,... ) ). Я не совсем понимаю, каким образом мне необходимо написать ХП на сервере, чтоб все корректно обрабатывалось при различном количестве переданных параметров. Подскажите как быть то?

P.S. я понимаю, что все прекрасно можно написать на клиенте, т е сформировать запрос, но может быть есть возможность реализовть так как я задумал. Если нет, то все будет реализовано на клиенте причем не прибегая к параметризированным запросам, что не есть гуд. Буду признателен за все идеи.
...
Рейтинг: 0 / 0
передаю различное количество параметров и -> непонимаю как это обработать корректно
    #34706761
Фотография buser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Массивы и Списки в SQL Server . Для других типов серверов чтонить похожее...
...
Рейтинг: 0 / 0
передаю различное количество параметров и -> непонимаю как это обработать корректно
    #34706762
Фотография FasterHarder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
I started in 1983, in 2007 i still on a case!

да, thank's buser за инфу, сейчас внимательно поизучаю/почитаю:). Respect!
...
Рейтинг: 0 / 0
передаю различное количество параметров и -> непонимаю как это обработать корректно
    #34708253
Фотография FasterHarder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
I started in 1983, in 2007 i still on a case!

В общем поразбирался, там примеры для интов и стрингов и в общем сделал я немного все попроще. В общем написал процедурку на сервере такого плана:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
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 LID IN (' + @LID + ')'
EXECUTE SP_EXECUTESQL  @SQLCMD	
END
все бы отработало отлично, если бы не тип поля UNIQUEIDENTIFIER у LID.
В общем у меня на шарпе есть некая функция:
Код: 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.
//=============================================================================
        // Намерение: данная функция будет получать на входе значение идентификаторов
        // изображений и сразу отправляет запрос к базе данных для 
        // отображения картинок на экране пользователя 
        //=============================================================================
        public void drawPictureOnMainForm( List<class_UniqueAndPosition_Picture> list_Pictures )
        {
            Exception exep = null;
            string str_param = "@";
            int i =  0 ;
            int countListElements = list_Pictures.Count;
            SqlParameter[] sql_param = new SqlParameter[countListElements];
            foreach (class_UniqueAndPosition_Picture c_U_P in list_Pictures)
            {
                sql_param[i] = new SqlParameter();
                sql_param[i].ParameterName = str_param + "P";
                sql_param[i].SqlDbType = SqlDbType.UniqueIdentifier;
                sql_param[i].Value = c_U_P.LID;
                ++i;
            }

            sql_dataRdr = ReturnsCountRecord.GET_DATA_FROM_DATAREADER(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
            {
                sql_dataRdr.Read();
                //.....
            }
            return;            

как видно из этой функции, параметры формируются динамически(так можно, так как их всего будет максимум 9).
Сама хранимка вызывается непосредственно из библиотке типов,через функцию GET_DATA_FROM_DATAREADER. Все таки приведу ее код:
Код: 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.
 //=============================================================================
        // Намерение: получить название всех областей( здесь используем старый термин область,
        // так как база данных старая. Позже переделаем, возможно, если будет команда от руководства)
        //=============================================================================
        public static SqlDataReader GET_DATA_FROM_DATAREADER(string sql_connectString, ref SqlParameter[] Param,
            CommandType SQLCmdType, ref Exception e, string sql_nameStoredProcedure)
        {
            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)
            {
                SqlParameter sql_parm;

                foreach (SqlParameter tempLoopVar_ParamTemp in Param)
                {
                    sql_parm = tempLoopVar_ParamTemp;
                    sql_cmd.Parameters.Add(sql_parm);
                }
            }
            // Open the connection
            try
            {
                sql_conn.Open();
                //Намерение: принудительно сменить имя нужной базы данных
                sql_conn.ChangeDatabase("???");
                sql_dataReader = sql_cmd.ExecuteReader(CommandBehavior.CloseConnection);
                return sql_dataReader;
            }
            catch (Exception ex)
            {
                // Намерение: вернуть исключение в клиентский код
                e = ex;
                return null;
            }            
        }
        //=============================================================================
        //=============================================================================
следовательно сервер не может преобразовать NVARCHAR В GUID. В общем проблема ваще то для меня практически не подъемная, я уже всяко извращался, но ничего не помогает. Подскажите как быть то?

P.S. если что нибудь непонятно, то все до мелочей расакажу. Буду очень, очень признателен за любую помощь.
...
Рейтинг: 0 / 0
передаю различное количество параметров и -> непонимаю как это обработать корректно
    #34708371
_logic_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
у вас в процедуре только 1 входной параметер, а вы туда загружаете много
ну и надо чтобы в этом 1 параметре уходило что то типа
'7560DB3F-EADD-412A-A25D-2B70C11BF557', '1949F4A0-A3FD-4F58-AE4D-E2873DB78872', ...
...
Рейтинг: 0 / 0
передаю различное количество параметров и -> непонимаю как это обработать корректно
    #34708386
Фотография FasterHarder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
I started in 1983, in 2007 i still on a case!

_logic_надо чтобы в этом 1 параметре уходило что то типа
'7560DB3F-EADD-412A-A25D-2B70C11BF557', '1949F4A0-A3FD-4F58-AE4D-E2873DB78872', ...

именно это. Как видите, передаются идентификаторы GUID, пока что в этом вся проблема:).
...
Рейтинг: 0 / 0
передаю различное количество параметров и -> непонимаю как это обработать корректно
    #34708408
Фотография FasterHarder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
I started in 1983, in 2007 i still on a case!

конечно же можно сделать так:

Код: 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.
public void drawPictureOnMainForm( List<class_UniqueAndPosition_Picture> list_Pictures )
        {
            string str_select ="'";
            Exception exep = null;
            string str_param = "@";
            int i = 0;
            int j = 0;
            int countListElements = list_Pictures.Count;
            SqlParameter[] sql_param = new SqlParameter[countListElements];
            foreach (class_UniqueAndPosition_Picture c_U_P in list_Pictures)
            {                
                if( j == (countListElements - 1 ))
                {
                    str_select = str_select + c_U_P.LID + "'";
                }
                else
                {
                   str_select = str_select + c_U_P.LID + "','";
                }
                //sql_param[i] = new SqlParameter();
                //sql_param[i].ParameterName = str_param + "P";
                //sql_param[i].SqlDbType = SqlDbType.UniqueIdentifier;
                //sql_param[i].Value = c_U_P.LID;
                ++i;
                ++j;
            }
            
            string s ="SELECT LID, BYTES FROM VID_DATA WHERE LID IN ( " + str_select + " ) ";
            MessageBox.Show(s);
            SqlCommand cmd = new SqlCommand(s, ....);


            return;
но это ужасно и такой вариант можно оставить только как временную заплатку, чтоб продолжать разработку. Подскажите как быть то?
...
Рейтинг: 0 / 0
передаю различное количество параметров и -> непонимаю как это обработать корректно
    #34708493
_logic_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
FasterHarder
именно это. Как видите, передаются идентификаторы GUID, пока что в этом вся проблема:).
это был не вопрос

еще раз, вы передаете много параметров

Код: plaintext
1.
2.
3.
4.
foreach (SqlParameter tempLoopVar_ParamTemp in Param)
                {
                    sql_parm = tempLoopVar_ParamTemp;
                    sql_cmd.Parameters.Add(sql_parm);
                }
а надо передать только один
Код: plaintext
@LID NVARCHAR( 400 )
да еще и тип его строковый (грубо говоря), делайте выводы ...
...
Рейтинг: 0 / 0
передаю различное количество параметров и -> непонимаю как это обработать корректно
    #34708726
Фотография FasterHarder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
I started in 1983, in 2007 i still on a case!

_logic_это был не вопрос

еще раз, вы передаете много параметров


foreach (SqlParameter tempLoopVar_ParamTemp in Param)
{
sql_parm = tempLoopVar_ParamTemp;
sql_cmd.Parameters.Add(sql_parm);
}
а надо передать только один

@LID NVARCHAR(400)
да еще и тип его строковый (грубо говоря), делайте выводы ...

да спасибо за направление и идею. Все получил что хотел. RESPECT! TOP CLOSE!
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / передаю различное количество параметров и -> непонимаю как это обработать корректно
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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