Могу ли я вернуть varchar (max) из хранимой процедуры?
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
что я могу делать.Размер для работы с a (max)?
обновление:
чтобы ответить на некоторые вопросы:
для всех намерений и целей этот текст должен выходить как один кусок. (Изменение этого потребует больше структурной работы, чем я хочу сделать - или уполномочен, на самом деле.)
Если я не задаю размер, я получаю сообщение об ошибке "String[6]: свойство Size имеет недопустимый размер 0."
10 ответов
Голосуют Эд Altofer. (Он ответил первым, поэтому, если вам нравится мой ответ, голосуйте и за него).
OleDb-ваша проблема. Это универсальное соединение с базой данных, которое должно взаимодействовать не только с SQL Server, и в результате у вас есть самый низкий общий знаменатель, в котором может полностью поддерживаться только самый слабый составной набор функций. Одна из потерянных функций-поддержка varchar (max).
вы используете SQL Server 2005 и VB.Net - ... Что мешает вам использовать Система.Данные.SqlClient, а не система.Данные.Для oledb?
редактировать
Я нашел документацию по этому вопросу. Смотрите здесь:
http://msdn.microsoft.com/en-us/library/ms131035.aspx
соответствующий фрагмент:
возвращаемые значения типа данных varchar(max), nvarchar(max), varbinary (max), xml, udt или другие большие типы объектов не могут быть возвращены клиентским версиям ранее SQL Server 2005. Если вы хотите использовать эти типы в качестве возвращаемых значений, вы должны использовать собственный клиент SQL Server.
можете ли вы использовать ADO.NET?
Edit: чтобы уточнить, я просто предлагаю вам рассмотреть ADO.NET так как вы работаете с VB.NET 2005 и SQL Server 2005--OLEDB был pre-.NET способ доступа к базам данных, поэтому вы можете найти больше гибкости, используя ADO.NET вместо этого.
вы не должны возвращать VARCHARs из хранимой процедуры. Я даже не уверен, что ты сможешь.
однако, если вы используете параметр OUT, вам не нужно указывать его по размеру. Например:
SqlParameter p = new SqlParameter("@RStr", SqlDbType.VarChar);
p.Direction = ParameterDirection.Output;
Не уверен, что это будет соответствовать вашим потребностям, но это должно работать нормально.
Я думаю, что использование -1 для размера будет работать. По крайней мере, это должно быть ADO.NET - ... Вот так:
objOutParam1 = objCommand.Параметры.Добавить ("@RStr", OleDbType.varchar, -1)
Это длинная статья, но она показывает через -1 в последнем примере:
Как выглядит эта большая строка? Возможно, это что-то, что можно было бы лучше вернуть через дополнительный набор записей, или это просто текст заметки?
просто использовать int.MaxValue для размера параметра. Байт[] из sproc будет иметь правильную длину. (Я остро использую varbinary, но результаты будут одинаковыми).
param.Size = int.MaxValue;
param.SqlDbType = SqlDbType.VarBinary;
вы пробовали с помощью "OleDbType.Типом longvarchar", этот тип сопоставляется с текстом в SQL server 2K и позволяет получить более 8K символов.
опция -1 работает довольно хорошо. Я использую его в нескольких случаях, когда у меня есть varchar(max) возврат из сохраненного proc.
короткий ответ-использовать текст вместо VARCHAR (max). 8K-это максимальный размер страницы базы данных, в которую должны вписываться все столбцы данных, кроме BLOB и TEXT. Это означает, что ваша доступная емкость меньше 8k из-за ваших других столбцов.
BLOB и текст так Веб 1.0. Больше строк, тем больше времени репликации базы данных, и большой файл я/О. Я предлагаю вам сохранить в отдельный файл-сервер с HTTP-интерфейс для этого.
и за предыдущий колонка
DataUrl VARCHAR (255) NOT NULL,
при вставке новой строки, сначала вычислить контрольную сумму MD5 данных. Во-вторых, загрузите данные на файловый сервер с контрольной суммой в качестве имени файла. В-третьих, вставить ...(...,DataUrl) значения(..., "http://fileserver/get?id=" . md5_checksum_data)
с помощью этого дизайна ваша база данных будет оставаться спокойной, даже если средний размер данных станет 1000x.