2013-10-07 62 views
0

我做了這樣的函數如何在方法中返回字符串值?

public int InsertData(CategoryPhoto catphoto) 
{ 
    string ans = null; 
    SqlCommand cmd = DataConnection.GetConnection().CreateCommand(); 
    cmd.CommandText = "prcCategoryPhoto"; 
    cmd.CommandType = CommandType.StoredProcedure; 
    // cmd.Parameters.Add(new SqlParameter("@PhotoID", prdctphoto.PhotoID)); 
    cmd.Parameters.Add(new SqlParameter("@PhotoName", catphoto.PhotoName)); 
    //cmd.Parameters.Add(new SqlParameter("@LeftPhoto", prdctphoto.LeftPhoto)); 
    //cmd.Parameters.Add(new SqlParameter("@RightPhoto", prdctphoto.RightPhoto)); 
    //cmd.Parameters.Add(new SqlParameter("@BackPhoto", prdctphoto.BackPhoto)); 
    //cmd.Parameters.Add(new SqlParameter("@MaterialPhoto", prdctphoto.MaterialPhoto)); 
    cmd.Parameters.Add(new SqlParameter("@ExtName", catphoto.ExtName)); 
    cmd.Parameters.Add(new SqlParameter("@PhotoType", catphoto.PhotoType)); 
    cmd.Parameters.Add(new SqlParameter("@PhotoSize", catphoto.PhotoSize)); 
    cmd.Parameters.Add(new SqlParameter("@CategoryID", catphoto.CategoryID)); 
    ans = cmd.ExecuteScalar().ToString(); 
    //var result = cmd.ExecuteScalar(); 
    //ans = int.Parse(result.ToString()); 
    cmd.Dispose(); 
    DataConnection.CloseConnection(); 
    return ans; 
} 

在我的存儲過程是

create proc [dbo].[prcCategoryPhoto] 
(
@PhotoName Varchar(100), 
@ExtName Varchar(100), 
@PhotoType Varchar(100), 
@PhotoSize int, 
@CategoryID varchar(20) 
) 
as 
insert into CategoryPhoto(PhotoName,ExtName,PhotoType,PhotoSize,CategoryID) 
    values (@PhotoName,@ExtName,@PhotoType,@PhotoSize,@CategoryID) 
select @@IDENTITY 

上寫return ans它給一個錯誤 不能隱式轉換字符串爲int

和書寫

return int.Parse(ans); 

它給出的例外是nvarchar不能轉換爲int

+1

可以讓我們知道你在'ans'得到什麼。? –

+3

你桌子上的你的身份專欄是什麼?什麼數據類型? – Szymon

回答

0

在調試器中查看你的字符串(ans)。看起來像你有一些字符不能轉換爲int。你可以將方法的返回類型從int更改爲字符串嗎?

1

現在試試這個.... `

public string InsertData(CategoryPhoto catphoto) 
    { 

    string ans = null; 
    SqlCommand cmd = DataConnection.GetConnection().CreateCommand(); 
    cmd.CommandText = "prcCategoryPhoto"; 
    cmd.CommandType = CommandType.StoredProcedure; 
    cmd.Parameters.Add(new SqlParameter("@PhotoName", catphoto.PhotoName)); 
    cmd.Parameters.Add(new SqlParameter("@ExtName", catphoto.ExtName)); 
    cmd.Parameters.Add(new SqlParameter("@PhotoType", catphoto.PhotoType)); 
    cmd.Parameters.Add(new SqlParameter("@PhotoSize", catphoto.PhotoSize)); 
    cmd.Parameters.Add(new SqlParameter("@CategoryID", catphoto.CategoryID)); 
    ans = cmd.ExecuteScalar().ToString(); 
    cmd.Dispose(); 
    DataConnection.CloseConnection(); 
    return ans; 
    }` 
0

你應該使用using關鍵字。它確保即使出現錯誤(即引發異常),也會調用dispose方法。

此外,在任何情況下(根據MSDN),@@Identity都會返回一個數值,該數值應該可以轉換爲整數或bigint。所以我的建議是:

public Int64 InsertData(CategoryPhoto catphoto) 
{ 
    using (var connection = DataConnection.GetConnection) 
    { 
    using (var cmd = connection.CreateCommand()) 
    { 
     cmd.CommandText = "prcCategoryPhoto"; 
     cmd.CommandType = CommandType.StoredProcedure; 
     cmd.Parameters.Add(new SqlParameter("@PhotoName", catphoto.PhotoName)); 
     cmd.Parameters.Add(new SqlParameter("@ExtName", catphoto.ExtName)); 
     cmd.Parameters.Add(new SqlParameter("@PhotoType", catphoto.PhotoType)); 
     cmd.Parameters.Add(new SqlParameter("@PhotoSize", catphoto.PhotoSize)); 
     cmd.Parameters.Add(new SqlParameter("@CategoryID", catphoto.CategoryID)); 
     return (Int64)cmd.ExecuteScalar(); 
    } 
    } 
} 

如果您的身份列是一個整數,你當然可以改變方法的簽名,以返回int代替。

1

嘗試下面, 首先改變你的程序,如下面添加一個輸出參數,

create proc [dbo].[prcCategoryPhoto] 
(
@PhotoName Varchar(100), 
@ExtName Varchar(100), 
@PhotoType Varchar(100), 
@PhotoSize int, 
@CategoryID varchar(20), 
@ID INT OUTPUT 
) 
as 
insert into CategoryPhoto(PhotoName,ExtName,PhotoType,PhotoSize,CategoryID) 
    values (@PhotoName,@ExtName,@PhotoType,@PhotoSize,@CategoryID) 
select @ID = @@IDENTITY 

下一頁修改如下的功能,

public int InsertData(CategoryPhoto catphoto) 
{ 
    SqlCommand cmd = DataConnection.GetConnection().CreateCommand(); 
    cmd.CommandText = "prcCategoryPhoto"; 
    cmd.CommandType = CommandType.StoredProcedure; 
    // cmd.Parameters.Add(new SqlParameter("@PhotoID", prdctphoto.PhotoID)); 
    cmd.Parameters.Add(new SqlParameter("@PhotoName", catphoto.PhotoName)); 
    //cmd.Parameters.Add(new SqlParameter("@LeftPhoto", prdctphoto.LeftPhoto)); 
    //cmd.Parameters.Add(new SqlParameter("@RightPhoto", prdctphoto.RightPhoto)); 
    //cmd.Parameters.Add(new SqlParameter("@BackPhoto", prdctphoto.BackPhoto)); 
    //cmd.Parameters.Add(new SqlParameter("@MaterialPhoto", prdctphoto.MaterialPhoto)); 
    cmd.Parameters.Add(new SqlParameter("@ExtName", catphoto.ExtName)); 
    cmd.Parameters.Add(new SqlParameter("@PhotoType", catphoto.PhotoType)); 
    cmd.Parameters.Add(new SqlParameter("@PhotoSize", catphoto.PhotoSize)); 
    cmd.Parameters.Add(new SqlParameter("@CategoryID", catphoto.CategoryID)); 

    cmd.Parameters.Add(new SqlParameter("@ID",System.Data.SqlDbType.Int)); 
    cmd.Parameters["@ID"].Direction=System.Data.ParameterDirection.Output; 

    cmd.ExecuteNonQuery(); 
    var ans = cmd.Parameters["@ID"].Value; 
    cmd.Dispose(); 
    DataConnection.CloseConnection(); 
    return Convert.ToInt32(ans); 
} 
+0

你有兩次聲明ans變量!@ –

0

更換

public int InsertData(CategoryPhoto catphoto) 

public string InsertData(CategoryPhoto catphoto) 

,並按照其依賴關係一樣的...

+0

範圍標識將返回int值,而不是字符串值!所以OP是正確的,他需要改變字符串ans = null;到int ans = null; –

0

的ScoapIdentity將返回你的PrimaryKey值,所以該數據類型爲int,所以你需要聲明爲int變量(不是一個字符串變量)。

所以替換該行string ans = null;int ans = null;

,也需要更改此線以下

ans = Convert.ToInt32(cmd.ExecuteScalar()); 
相關問題