C# 使用C执行存储过程时使用多个参数#

C# 使用C执行存储过程时使用多个参数#,c#,sql-server,stored-procedures,C#,Sql Server,Stored Procedures,我不熟悉开发和SQL,但想尝试创建一个简单的应用程序,供我自己使用。我为SQL Server 2012数据库创建了以下存储过程: CREATE PROCEDURE AddAchievement @AchievementName varchar(50), @AchievementHeading varchar(50), @AchievementPoints varchar(4), @AchievementDescription varchar(1000) AS

我不熟悉开发和SQL,但想尝试创建一个简单的应用程序,供我自己使用。我为SQL Server 2012数据库创建了以下存储过程:

CREATE PROCEDURE AddAchievement
    @AchievementName varchar(50),
    @AchievementHeading varchar(50),
    @AchievementPoints varchar(4),
    @AchievementDescription varchar(1000)
AS
    IF EXISTS (SELECT * FROM Achievements WHERE AchievementName = @AchievementName)
        UPDATE dbo.Achievements
        SET AchievementName = @AchievementName,
            AchievementHeading = @AchievementHeading,
            AchievementPoints = @AchievementPoints,
            AchievementDescription = @AchievementDescription
    ELSE
        INSERT INTO dbo.Achievements
            SELECT 
                @AchievementName, @AchievementHeading, 
                @AchievementPoints, @AchievementDescription
然后,我想在Visual Studio 2015中创建的windows应用程序中执行此存储过程

我已经添加了我的数据集,并添加了一个表适配器,它被设置为使用此存储过程

下面是我用来执行过程的代码:

SqlConnection sqlConnection1 = new SqlConnection("Data Source=****;Initial Catalog=****;Persist Security Info=True;User ID=****;Password=****");

SqlCommand cmd = new SqlCommand();
Int32 rowsAffected;

cmd.CommandText = achievementsTableAdapter.AddAchievement(txtAchievementName.Text, txtAchievementHeading.Text, txtAchievementPoints.Text, txtAchievementDescription.Text);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Connection = sqlConnection1;

sqlConnection1.Open();
rowsAffected = cmd.ExecuteNonQuery();
sqlConnection1.Close();
我的表单上有四个文本框,输入其中的文本将用作传递到存储过程的参数。我确信有更好的方法来编写代码,但本质上它是有效的。我只得到一个错误,我认为这是因为存储过程被设置为忽略主键列

我得到的错误是:

无法将类型“int”隐式转换为“string”

我的所有参数都没有设置为int,但存储过程所使用的表中确实有一个主键,而该主键在存储过程或代码中没有引用。如果错误指向PK,我不知道如何解决这个问题,因为这是设置的,所以它会随着每一行添加到表中而自动递增,所以我不想通过代码或存储过程与此交互

有人能帮我确定错误是否也涉及PK,如果是,我如何避开它?如果不是PK,有人对我为什么在不使用int时引用int时出错有什么建议吗


提前感谢您抽出时间

看起来过程中设置了AcheivementPoints以获取tinyint,但您试图将其作为文本传递给适配器。

Steve用解决方案对我的问题进行了评论,解决了我的错误。单击我的按钮时执行的代码如下:

        SqlConnection sqlConnection1 = new SqlConnection("Data Source=****;Initial Catalog=****;Persist Security Info=True;User ID=****;Password=****");
        sqlConnection1.Open();
        Int32 rowsAffected = achievementsTableAdapter.AddAchievement(txtAchievementName.Text, txtAchievementHeading.Text, txtAchievementPoints.Text, txtAchievementDescription.Text);
        sqlConnection1.Close();

SqlCommand.CommandText是一个字符串,但什么返回您的AddAchization?我假设这是他说他创建的表适配器,但他没有显示AchizationTableAdapter的创建位置或创建方式。
除了
@AchizationPoints tinyint,
抱歉,我输入了一段较旧的代码。后来我将该变量更改为varchar,因此也更新了上面的代码。是否尝试:Int32 rowsAffected=achievementsTableAdapter.AddAchievent(txtAchieventName.Text,txtAchieventHeading.Text,txtAchieventPoints.Text,txtAchieventDescription.Text);并注释掉所有与SqlCommand相关的代码?您真的需要创建/打开/关闭连接吗?