使用C#

时间:2016-04-04 20:05:07

标签: 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
    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时出错的建议?

提前感谢您的时间。

2 个答案:

答案 0 :(得分:0)

看起来在proc中设置了AcheivementPoints来获取tinyint,但是你试图将它作为文本传递给适配器。

答案 1 :(得分:0)

史蒂夫用一个解决我的错误的解决方案评论了我的问题。单击按钮时执行的代码现在如下:

        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();