Как отобразить хранимую процедуру SQL в VB? - PullRequest
1 голос
/ 12 апреля 2011

Я использую SSMS 2008 и VB.Я начинающий разработчик VB.Я пытаюсь отобразить результаты простого хранимого процесса на моей странице ASPX.Но я получаю ошибку ниже.Вот мой код для страницы ASPX:

>           MsgBox(GlobalFunctions.GlobalF.GetDevSQLServerStoredProcedure())

И мой код из пространства имен GlobalF:

Public Shared Function GetDevSQLServerStoredProcedure()
    Dim conn As SQLConnection
    Dim DSPageData As New System.Data.DataSet

    conn = New SQLConnection(ConfigurationSettings.AppSettings("AMDMetricsDevConnectionString"))
    Dim cmd As New SQLCommand

    cmd.CommandType = CommandType.StoredProcedure
    cmd.Connection = conn
    cmd.CommandText = "AllTableCount"

    Dim da = New SQLDataAdapter(cmd)
    da.Fill(DSPageData)
    Return DSPageData
End Function

И моя ошибка:

Аргумент 'Подсказка 'не может быть преобразована в тип' String '

[ArgumentException: Аргумент' Подсказка 'не может быть преобразован в тип' String '.] Microsoft.VisualBasic.Interaction.MsgBox (Object Prompt, MsgBoxStyle Buttons, Object Title)+ 320
ASP.website_complaints_complainttrendinglist3_aspx.Main () в e: \ inetpub \ amdmetrics-d.web.abbott.com \ wwwroot \ Website \ Complaints \ ComplaintTrendingList3.aspx: 113 ASP.website_complaints_complainttxage_Reader.Reglist) в e: \ inetpub \ amdmetrics-d.web.abbott.com \ wwwroot \ Website \ Complaints \ ComplaintTrendingList3.aspx: 60 System.Web.Util.CalliHelper.EventArgFunctionCaller (IntPtr fp, Объект o, Объект t, EventArgs e)+14 System.Web.Util.CalliEventHandlerDelegateProxy.Callback (отправитель объекта, EventArgs e) + 35
System.Web.UI.Control.OnLoad (EventArgs e) + 99
System.Web.UI.Control.LoadRecursive () +50 System.Web.UI.Page.ProcessRequestMain (Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) + 627

Эта хранимая процедура просто возвращает количество записей в моей базе данных.Но я хочу выполнить другие хранимые процедуры, которые возвращают таблицу.Как реализовать это без ошибок?

Наконец, мой новый SQL SP:

CREATE proc [dbo].PrintTestMsg AS BEGIN 
PRINT 'HELLO'
PRINT 'WORLD'
PRINT 'PAGE3'
PRINT 'PAGE4'
END

SELECT * FROM SELECT (EXEC PrintTestMsg)

Я получаю синтаксическую ошибку в SSMS с указанным выше выбором.

Как насчет кода ниже?Могу ли я получить набор данных сейчас?

private string DatasetToString(DataSet ds)
{ 

StringBuilder sb = new StringBuilder();
DataTable dt = ds.Tables(0);

foreach (DataRow dr in dt.Rows) {
sb.Append(“;”);
sb.Append(dt.Rows(1).ToString());
}

return sb.ToString();

}

1 Ответ

4 голосов
/ 12 апреля 2011

Не беспокойтесь о преобразовании набора данных в строку.Ваша настоящая проблема в том, что вы не можете использовать обычную функцию MsbBox () в asp.net.В самом деле.Если вы попытаетесь, он отобразит сообщение на скрытом частном рабочем столе на веб-сервере.На компьютере пользователя не появится всплывающее сообщение.Мало того, он будет блокироваться до тех пор, пока на него не нажмут, и поскольку он находится на скрытом рабочем столе, этого никогда не произойдетВ результате страница вашего пользователя никогда не загрузится.

Вместо этого вы хотите связать результат метода GetDevSQLServerStoredProcedure() с элементом управления GridView, DataGrid или Repeater.Есть и другие проблемы в вашем коде, поэтому я проведу быструю очистку каждой части, чтобы показать вам, как она должна выглядеть:

''#Always list the type returned at the end of the method name
Public Shared Function GetDevSQLServerStoredProcedure() As DataSet
    Dim DSPageData As New System.Data.DataSet

    ''# A Using block will ensure the .Dispose() method is called for these variables, even if an exception is thrown
    ''# This is IMPORTANT - not disposing your connections properly can result in an unrespsonsive database
    Using conn As New SQLConnection(ConfigurationSettings.AppSettings("AMDMetricsDevConnectionString")), _
          cmd As New SQLCommand("PrintTestMsg", conn), _
          da As New SQLDataAdapter(cmd)

        cmd.CommandType = CommandType.StoredProcedure

        da.Fill(DSPageData)
    End Using

    Return DSPageData
End Function

Теперь ваша хранимая процедура.Это ничего не возвращает, поэтому я добавил код к и , чтобы вернуть распечатанные данные на вашу страницу:

CREATE proc [dbo].PrintTestMsg AS BEGIN 
    PRINT 'HELLO'
    PRINT 'WORLD'
    PRINT 'PAGE3'
    PRINT 'PAGE4'

    SELECT 'HELLO' AS Msg
    UNION
    SELECT 'WORLD'
    UNION
    SELECT 'PAGE3'
    UNION 
    SELECT 'PAGE4'
END

Вам необходимо добавить это в разметку aspx:

<asp:GridView ID="PrintMessageGrid" runat="server" AutoGenerateColumns="True" />

И, наконец, замените вызов функции MsgBox () следующим кодом:

PrintMessageGrid.DataSource = GetDevSQLServerStoredProcedure() 
PrintMessageGrid.DataBind()

Обратите внимание, что этого достаточно, чтобы все заработало в базовом смысле, чтобы вы могли продолжатьизучить ASP.Net.Некоторые методы, которые я только что опубликовал, я бы никогда не использовал на производственном веб-сайте.В качестве примера можно привести AutoGenerateColumns в GridView и даже наборы данных (почти всегда лучший вариант для чтения данных).Это всего лишь минимальное изменение исходного кода, так что вы можете начинать собирать все вместе и изучать лучшие приемы по мере прохождения практики.

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