从数据库asp.net C#

时间:2016-05-02 14:52:30

标签: c# sql asp.net

我的问题是,当我想将一个用户插入数据库时​​,它不会让我。我试图调试它,但它没有告诉我太多。互联网没有帮助,我写的所有内容都对我有意义,但由于某种原因,我无法超越它。

string query = "Insert Into [dbo].[People] Values (
                @CountryID, 
                @FirstName, 
                @SurName, 
                @Email, 
                @Score);" + "Select Scope_Identity();";
int id;  
try
{
    using (SqlConnection con = new SqlConnection(connectionString))
    {
        using (SqlCommand cmd = new SqlCommand(query, con))
        {
            cmd.Parameters.AddWithValue("@CountryID", natDP.SelectedValue);
            cmd.Parameters.AddWithValue("@FirstName", nameTb.Text);
            cmd.Parameters.AddWithValue("@SurName", surnameTB.Text);
            cmd.Parameters.AddWithValue("@Email", emailTB.Text);
            cmd.Parameters.AddWithValue("@Score", 1);
            con.Open();
            id = (int)cmd.ExecuteScalar();
        }
    }
    emailTB.Text = id.ToString();
}

修改

不是使用上面的方法来插入参数,而是创建了一个新方法,可以很好地满足上述问题。

我有一个名为PeopleController的新控制器,在这个控制器中我有以下代码。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web;
using System.Web.Http;

[Authorize]
public class PeopleController : ApiController //Api controller to resieve ajax requests
{
    // For Retrieving Data
    HttpRequest request = HttpContext.Current.Request;
    // Calling DB object
    dbDataContext db = new dbDataContext();

}

然后我创建了一个将在新方法中调用的新sproc,然后将此sproc添加到我的DbContext对象中。下面的sql是它的外观。

CREATE PROC dbo.sp_People_Insert
(
    @CountryID INT,
    @FirstName VARCHAR(100),
    @SurName VARCHAR(100),
    @Email VARCHAR(100),
    @Score INT
)AS
BEGIN

    INSERT INTO People(CountryID, FirstName, SurName, Email, Score)
    VALUES (@CountryID, @FirstName, @SurName, @Email, @Score)
    SELECT SCOPE_IDENTITY()

END
GO

最后将要执行的方法。该方法将使用ajax通过request变量接收值。此方法放在PeopleController中。然后将该ID作为int返回。

// Insert
public int PostPeople()
{
    int id = db.sp_People_Insert(
        Convert.ToInt32(request["CountyID"]),
        request["FirstName"],
        request["SurName"],
        request["Email"],
        Convert.ToInt32(request["Score"])
        );

    return id;
}

我发现这是一个更优雅的解决方案,并且比将输入传递给服务器我更可维护,而不是使用ajax。

希望有帮助的人会在这篇很老的帖子上绊倒你,这些你在几年后学到的东西

2 个答案:

答案 0 :(得分:0)

查询的返回值不是INT,而是小数。 这就是你失败的原因。

例如:

// Weird but works 
decimal result = (decimal)cmd.ExecuteScalar();

但是,使用Convert.ToInt32也可以在不更改查询的情况下工作。

 id = Convert.ToInt32(cmd.ExecuteScalar());

另外,您可以应用上述评论中的建议或更改您的查询以使用OUTPUT INSERTED

  @"Insert Into [dbo].[People] OUTPUT INSERTED.PeopleID 
    Values (@CountryID, @FirstName, @SurName, @Email, @Score);" 

应将PeopleID更改为使用您的IDENTITY列的真实姓名

答案 1 :(得分:0)

你可以用你的字符串来做这件事@Steve所建议的也行 我个人对这两方面都很熟悉。 我会将其转换为存储过程并为您节省做Concat Sql命令的麻烦

string query = "Insert Into [dbo].[People] Values (@CountryID, @FirstName, @SurName, @Email, @Score)SELECT CAST(scope_identity() AS int)";