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 に変換できないという例外が発生します

4

6 に答える 6

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);
}
于 2013-10-24T04:18:26.753 に答える
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;
  }`
于 2013-10-07T05:09:04.927 に答える
0

交換

 public int InsertData(CategoryPhoto catphoto)

 public string InsertData(CategoryPhoto catphoto)

その依存関係についても同じことに従います...

于 2013-10-24T04:32:42.147 に答える
0

デバッガーで文字列 (ans) を確認します。int に変換できない文字がいくつかあるようです。メソッドの戻り値の型を int から string に変更できますか?

于 2013-10-07T05:08:17.660 に答える
0

usingキーワードを使用する必要があります。dispose何か問題が発生した場合 (つまり、例外が発生した場合) であっても、メソッドが確実に呼び出されるようにします。

また、@@Identity(MSDN によると) いずれの場合も数値を返します。これは、整数または 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();
    }
  }
}

ID 列が整数の場合は、もちろんメソッドのシグネチャを変更して、int代わりに を返すことができます。

于 2013-10-07T05:29:00.163 に答える