Неправильная синтаксическая ошибка при доступе к удаленной хранимой процедуре - PullRequest
0 голосов
/ 24 июля 2010

StackOverflow - я все еще пытаюсь развернуть этот сайт, но с каждой проблемой, которую я решаю, возникает другая. В любом случае - я настроил базу данных на своем хостинге, чтобы разрешить удаленные подключения, и она работает под управлением Sql Server 2005. На моей машине для разработки я работаю с Sql Server 2008.

Я установил схему asp.net в своей размещенной базе данных и создал несколько пользователей из интерфейса веб-администрирования ASP.NET, а также проверил, работает ли вход в систему. Локальный запуск приложения со строкой удаленного соединения дает те же результаты. Тем не менее, я могу запускать свои сценарии и генерировать свои таблицы и хранимые процедуры без ошибок, но когда сайт запущен, я получаю следующую ошибку на всех моих страницах .aspx, которые пытаются получить доступ к хранимой процедуре:

Server Error in '/' Application.
Incorrect syntax near 'LoadProfileData'.
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.Data.SqlClient.SqlException: Incorrect syntax near 'LoadProfileData'.

Source Error:

Line 62:             adapter.SelectCommand.Parameters.Add("@ProfessionalName", SqlDbType.VarChar).Value = professionalName;
Line 63:             DataSet profile = new DataSet();
Line 64:             adapter.Fill(profile, "Profile");
Line 65:             return profile;
Line 66:         }

Это возможная проблема Sql 2005 против 2008? Я надеюсь, что кто-то еще видел эту проблему в похожем сценарии и может указать мне правильное направление. Сервер работает под управлением asp.net 2.0, 3.0 и 3.5 и IIS 7.0.

Хранимая процедура:

-- =============================================
-- Create date: <July 2010>
-- Description: <Create default Professional Profile>
-- =============================================
Drop procedure CreateDefaultProfile
GO
Create procedure CreateDefaultProfile(@UserName varchar(256))
as
    declare @ProfessionalID uniqueidentifier
    set @ProfessionalID = (select UserId from aspnet_Users where UserName = @UserName)


    declare @email varchar(256)
    set @email = (select Email from aspnet_Membership where UserId = @ProfessionalID)

    insert into Professional(ProfessionalID, Name, Email, Phone, TypeID, DisplayPictureUrl, ProfileHeader, ProfileSubHeader, ProfileContent, ServicesHeader, ServicesContent)
    values (@ProfessionalID, '', @email, '', '', 'css/img/profilepicture_default.jpg', '', '', '', '', '')


    GO

    -- exec CreateDefaultProfile 'Mounir'
    -- select * from Professional

Метод уровня доступа к данным:

//"Data Source=localhost;Initial Catalog=MHNProServices;Integrated Security=SSPI"
        const string ConnectionString =
            "Data Source=mhnproservices.db.5322869.hostedresource.com; Initial Catalog=mhnproservices; User ID=mhnproservices; Password='***********'";

        internal static void CreateDefaultProfile(string professionalName)
        {
            SqlConnection conn = new SqlConnection(ConnectionString);
            SqlDataAdapter adapter = new SqlDataAdapter("CreateDefaultProfile @ProfessionalName", conn);
            adapter.SelectCommand.Parameters.Add("@ProfessionalName", SqlDbType.VarChar).Value = professionalName;

            conn.Open();
            adapter.SelectCommand.ExecuteNonQuery();
            conn.Close();
        }

Ответы [ 3 ]

1 голос
/ 24 июля 2010

Мне нужно было добавить exec перед вызовом процедуры. Это только разница в синтаксисе между 2005 и 2008? В любом случае, следующие работы:

 SqlDataAdapter adapter = new SqlDataAdapter("exec CreateDefaultProfile @ProfessionalName", conn);
1 голос
/ 24 июля 2010

Если вы хотите выполнить хранимую процедуру (в общем), вы делаете это слишком сложно - зачем использовать SqlDataAdapter для вызова ExecuteNonQuery в конце ??

Попробуйте вместо этого код:

 internal static void CreateDefaultProfile(string professionalName)
 {
     using(SqlConnection conn = new SqlConnection(ConnectionString))
     {
         using(SqlCommand cmd = new SqlCommand("CreateDefaultProfile", conn))
         {
             cmd.CommandType = CommandType.StoredProcedure;
             cmd.Parameters.Add("@ProfessionalName", 
                     SqlDbType.VarChar, 100).Value = professionalName;

             conn.Open();
             cmd.ExecuteNonQuery();
             conn.Close();
         }
    }
}

Если вы когда-либо звоните только ExecuteNonQuery, просто используйте SqlCommand для этого - вы можете сказать, что он также вызывает хранимую процедуру! Также оберните ваши ADO.NET вещи в using() {....} блоки, чтобы убедиться, что они удачно расположены. И последнее, но не менее важное: определите длину для вашего параметра VARCHAR.

С этими изменениями все должно работать нормально и очень плавно.

0 голосов
/ 24 июля 2010

Сообщение об ошибке говорит о том, что ваш SQL неверен.Показанный код c # - это то место, где выполняется SQL.Чтобы помочь вам, мне понадобится посмотреть код SQL, предположительно источник хранимой процедуры.

Возможно, вы могли бы обновить вопрос, чтобы показать SQL?

...