Могу ли я вернуть varchar (max) из хранимой процедуры? - PullRequest
9 голосов
/ 21 октября 2008

Веб-система VB.net с бэкэндом SQL Server 2005. У меня есть хранимая процедура, которая возвращает varchar, и мы наконец получаем значения, которые не помещаются в varchar (8000).

Я изменил возвращаемый параметр на varchar (max), но как мне сообщить свойству OleDbParameter.Size принимать любое количество текста?

В качестве конкретного примера, код VB, который получил параметр возврата из хранимой процедуры, выглядит следующим образом:

objOutParam1 = objCommand.Parameters.Add("@RStr", OleDbType.varchar)
objOutParam1.Size = 8000
objOutParam1.Direction = ParameterDirection.Output

Что я могу сделать. Размер для работы с (макс)?

Обновление:

Чтобы ответить на несколько вопросов:

Для всех намерений и целей, этот текст должен быть представлен одним куском. (Изменение этого потребовало бы больше структурной работы, чем я хочу - или действительно, на что у меня есть полномочия.)

Если я не установил размер, я получаю сообщение об ошибке «String [6]: свойство Size имеет недопустимый размер 0».

Ответы [ 10 ]

8 голосов
/ 21 октября 2008

Upvoted Эд Альтофер. (Сначала он ответил, так что, если вам нравится мой ответ, проголосуйте и за него).

OleDb это ваша проблема. Это общее соединение с базой данных, которое должно взаимодействовать не только с SQL Server, и в результате вы получаете ситуацию с наименьшим общим знаменателем, когда полностью поддерживается только самый слабый составной набор функций. Одна из потерянных функций - поддержка varchar (max).

Вы используете SQL Server 2005 и VB.Net. Что мешает вам использовать System.Data.SqlClient, а не System.Data.OleDb?

Редактировать
Я нашел документацию по этому вопросу. Смотрите здесь:
http://msdn.microsoft.com/en-us/library/ms131035.aspx

Соответствующая часть:

Возвращаемые значения типа данных varchar (max), nvarchar (max), varbinary (max), xml, udt или другие типы больших объектов не могут быть возвращены в версии клиента ранее, чем SQL Server 2005 Если вы хотите использовать эти типы в качестве возвращаемых значений, вы должны использовать собственный клиент SQL Server.

8 голосов
/ 21 октября 2008

Можете ли вы использовать ADO.NET?

Редактировать: Чтобы уточнить, я просто предлагаю вам рассмотреть ADO.NET, поскольку вы работаете с VB.NET 2005 и SQL Server 2005 - OLEDB был до .NET способ доступа к базам данных, поэтому вы можете найти больше гибкости, используя вместо этого ADO.NET.

Вы не должны возвращать VARCHAR из хранимой процедуры. Я даже не уверен, что ты можешь.

Однако, если вы используете параметр OUT, вам не нужно указывать его по размеру. Например:

SqlParameter p = new SqlParameter("@RStr", SqlDbType.VarChar);
p.Direction = ParameterDirection.Output;

Не уверен, подойдет ли это вашим потребностям, но он должен работать просто отлично.

4 голосов
/ 05 ноября 2008

Я думаю, что использование -1 для размера будет работать. По крайней мере, так должно быть с ADO.NET. Как это:

objOutParam1 = objCommand.Parameters.Add ("@ RStr", OleDbType.varchar, -1)

Это длинная статья, но она показывает использование -1 в последнем примере:

http://msdn.microsoft.com/en-us/library/bb399384.aspx

1 голос
/ 21 октября 2008

Вы пытались не указывать размер?
Не могли бы вы вернуть текст вместо VARCHAR (MAX)?

0 голосов
/ 09 апреля 2009

Параметр -1 работает довольно хорошо. Я использую его в нескольких случаях, когда у меня есть возврат varchar (max) из сохраненного процесса.

0 голосов
/ 05 ноября 2008

Вы пробовали использовать " OleDbType.LongVarChar ", этот тип сопоставляется с текстом в SQL Server 2K и позволяет получать более 8K символов.

0 голосов
/ 05 ноября 2008

Просто используйте int.MaxValue для размера параметра. Байт [] из sproc будет иметь правильную длину. (Я использую varbinary, но результат будет таким же).

 param.Size = int.MaxValue;
 param.SqlDbType = SqlDbType.VarBinary;
0 голосов
/ 22 октября 2008

Короткий ответ - использовать ТЕКСТ вместо VARCHAR (макс.). 8K - это максимальный размер страницы базы данных, в которую должны помещаться все ваши столбцы данных, кроме BLOB и TEXT. Это означает, что ваша доступная емкость меньше 8 КБ из-за других ваших столбцов.

BLOB и TEXT - это Web 1.0. Большие строки означают большее время репликации базы данных и больший файловый ввод / вывод. Я предлагаю вам поддерживать отдельный файловый сервер с HTTP-интерфейсом для этого.

А, для предыдущего столбца

DataUrl VARCHAR (255) NOT NULL,

При вставке новой строки сначала вычислите контрольную сумму MD5 данных. Во-вторых, загрузите данные на файловый сервер с контрольной суммой в качестве имени файла. В-третьих, INSERT INTO ... (..., DataUrl) VALUES (..., "http://fileserver/get?id=". Md5_checksum_data)

При таком дизайне ваша база данных будет оставаться спокойной, даже если средний размер данных станет 1000x.

0 голосов
/ 21 октября 2008

Вы пытались указать:

objOutParam1.Size = Int32.MaxValue;
0 голосов
/ 21 октября 2008

Как выглядит эта большая строка? Возможно, это что-то, что может быть лучше возвращено через дополнительный набор записей, или это просто текст примечания?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...