0

StackOverflow - 我仍在嘗試部署此站點,但是解決了每個問題後,出現了另一個問題。無論如何 - 我已經在我的主機上建立了數據庫以允許遠程連接,並且正在運行Sql Server 2005.在我的開發機器上,我正在使用Sql Server 2008.訪問遠程存儲過程時的語法錯誤不正確

我已經安裝了asp.net架構在我的託管數據庫上,並從ASP.NET Web管理界面創建了多個用戶,並測試了登錄的工作方式。使用遠程連接字符串在本地運行應用程序可獲得相同的結果。但是 - 我能夠運行我的腳本並生成我的表和存儲過程而沒有錯誤 - 但是當站點運行時,我在嘗試訪問存儲過程的所有.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 vs 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(); 
     } 
+1

這將有助於看到實際的源代碼 – 2010-07-23 22:55:47

回答

1

我需要在過程調用之前添加exec。這僅僅是2005年和2008年之間的語法差異?不管怎麼說,以下工作:

SqlDataAdapter adapter = new SqlDataAdapter("exec CreateDefaultProfile @ProfessionalName", conn); 
+3

我不知道。我會創建一個'SqlCommand'對象。將其設置爲類型存儲過程並分配過程名稱。然後將其傳遞給'SqlDataAdapter'。請參閱http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldataadapter.aspx。此方法不依賴於SQL版本。 – 2010-07-23 23:16:31

0

錯誤消息告訴你,你的SQL不正確。顯示的c#代碼是執行SQL的位置。爲了幫助你,我需要看到SQL代碼,大概是存儲過程源代碼。

也許你可以更新問題來顯示SQL?

+0

謝謝,我提供了上面的代碼,其中重要的是要注意我*在連接字符串中輸出密碼。 – Gallen 2010-07-23 23:02:30

+0

我正在查看SQL,但沒有看到對「LoadProfileData」的引用。錯誤消息表明語法錯誤在那裏。所以這不是產生錯誤的SQL,除非'Professional'表具有插入觸發器。 – 2010-07-23 23:11:59

+0

此錯誤出現在所有存儲過程中,我發佈了錯誤消息中描述的錯誤,但問題已修復,感謝您的幫助。 – Gallen 2010-07-24 00:01:34

1

如果要執行存儲過程(一般),你這樣做太複雜 - 爲什麼要使用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參數定義一個長度。

隨着這些變化,一切都應該工作得很好,非常順利。