【问题标题】:C# sql server 2008 r2 insert stored procedure won't workC# sql server 2008 r2 插入存储过程不起作用
【发布时间】:2011-02-17 14:24:00
【问题描述】:

我有这个无法正常工作的存储过程。如果我在管理工作室尝试这个查询并填写了我的参数,我看不到我的代码是否做错了,但我希望这里有人注意到我做错了什么

CREATE PROCEDURE new_project 
-- Add the parameters for the stored procedure here
@proj_naam nvarchar = null,
@plaats nvarchar = null,
@opd_geef int = 0,
@status int = 0,
@proj_id int = 0  AS  BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;

-- Insert statements for procedure here
INSERT INTO project (naam_project, plaats, opdrachtgeverZEEBREGTS_nr, status, project_NR)
VALUES (@proj_naam, @plaats, @opd_geef, @status, @proj_id)  END  GO

和c#代码:

System.Data.SqlClient.SqlConnection con;
            con = new System.Data.SqlClient.SqlConnection();
            con.ConnectionString = Global.ConnectionString_fileserver;
            con.Open();
            string stopro = "";
            switch (type)
            {
                case 1:
                    stopro = "new_project";
                    break;
                case 2:
                    stopro = "new_bedrijf";
                    break;
                case 3:
                    stopro = "new_persoon";
                    break;
            }
            SqlCommand command = new SqlCommand(stopro, con);
            command.CommandType = CommandType.StoredProcedure;
            switch (type)
            {
                case 1:
                    SqlParameter proj_naam = command.Parameters.Add("@proj_naam", SqlDbType.NVarChar);
                    SqlParameter plaats = command.Parameters.Add("@plaats", SqlDbType.NVarChar);
                    SqlParameter opdrachtgever = command.Parameters.Add("@opd_geef", SqlDbType.Int);
                    SqlParameter status = command.Parameters.Add("@status", SqlDbType.Int);
                    SqlParameter proj_id = command.Parameters.Add("@proj_id", SqlDbType.Int);
                    proj_naam.Value = tb_proj_projectnaam.Text; proj_naam.Direction = ParameterDirection.Input;
                    plaats.Value = tb_proj_plaats.Text; plaats.Direction = ParameterDirection.Input;
                    opdrachtgever.Value = cb_proj_opdrachtgever.SelectedValue; opdrachtgever.Direction = ParameterDirection.Input;
                    status.Value = cb_proj_status.SelectedValue; status.Direction = ParameterDirection.Input;
                    proj_id.Value = id; proj_id.Direction = ParameterDirection.Input;
                    break;  
            }  
            int nwok = command.ExecuteNonQuery();
            con.Close();

所以我希望有人可以提前帮助!

【问题讨论】:

  • 它会抛出特定的错误吗?
  • 你能定义“行不通”吗?它会给出错误消息,还是不返回任何内容?它是否真的到达了 ExecuteNonQuery 行,因为它是在休息之后,但这可能是因为你剪掉了一些代码。
  • 没有错误,int nwok 存储受影响的行数,所以如果添加一行,它将返回 1,如果不是 0,我只会得到 0。如果我检查我的数据库新行不存在。所以它什么也没做。
  • 另外,我很抱歉,但我只需要说显而易见的,因为我自己以前做过。您确定您使用的是正确的 SQL Server 吗?我无法告诉你我对 Dev 执行了多少次,但对 Live 进行了检查。
  • @Chris Haas,哈哈,幸运的是,事实并非如此。这个问题现在已经解决了(谢谢你们)现在我需要找出为什么他从上次添加新记录而不是下一个最小的不存在的 nr 开始一直使用 ID# .. 所以我将有事可做这个周末:)

标签: c# stored-procedures sql-server-2008-r2


【解决方案1】:

您的int nwok = command.ExecuteNonQuery(); 之前有一个break

编辑

与您的 SPROC 未执行的原因无关,但您有 SET NOCOUNT ON,这将导致 -1 被 ExecuteNonQuery 返回。你在插入之前运行SET NOCOUNT OFF 吗?

【讨论】:

  • 这是因为在那之后还有一些不相关的情况被我删掉了,所以帖子不会长一英里:P 但如果执行被调用,我会检查。编辑:不,执行被调用就好了..
  • NOCOUNT ON 是我没有工作的原因之一,愚蠢的自动生成的微软代码。另一个是(我认为)没有为 NVARCHAR 定义长度
【解决方案2】:

我可以看到,如果 Case 不是 1 在您的 switch case 中,那么命令实例永远不会获取这些参数,因此它不会工作。

【讨论】:

  • @Ardman 不是在编辑之前。所以我的回答是针对这种情况的。你可以检查他的问题的修订
  • 这不是休息的好地方吗?在声明的 and 在我定义案例 2 之前:?我检查了是否使用消息框调用了案例 1,并且效果也很好。
  • @Daanvl:是的,这是定义break 语句的正确位置。
  • @Daanvl: 不,你的 break 语句完全在正确的位置。如果正确的值被传递给参数并且命令实例正在获取参数,你应该检查调试器
  • @Shekhar_Pro 我找到了这个程序 anjlab sql profiler 并得到了这个:exec new_project @proj_naam=N'Daan',@plaats=N'tilburg',@opd_geef=4,@status=2,@ proj_id=946 和其他一些行,'' 之前的 N 是什么问题,还是定义 NVARCHAR?
【解决方案3】:

在这里,您正在 switch 语句中测试 type:

switch (type)             
{                 
    case 1:                     
        stopro = "new_project";                     
        break;                 
    case 2:
        stopro = "new_bedrijf";                     
        break;
    // etc.
}

然后,您在另一个 switch 语句中重新测试 type,这只是矫枉过正。将您的参数移动到第一个 switch 语句中,这可能会解决您的错误。

switch (type)             
{                 
    case 1:                     
        stopro = "new_project";     
        SqlParameter proj_naam = command.Parameters.Add("@proj_naam", SqlDbType.NVarChar);                     
        SqlParameter plaats = command.Parameters.Add("@plaats", SqlDbType.NVarChar);
        SqlParameter opdrachtgever = command.Parameters.Add("@opd_geef", SqlDbType.Int); 
        SqlParameter status = command.Parameters.Add("@status", SqlDbType.Int); 
        SqlParameter proj_id = command.Parameters.Add("@proj_id", SqlDbType.Int);
        proj_naam.Value = tb_proj_projectnaam.Text; 
        proj_naam.Direction = ParameterDirection.Input;   
        plaats.Value = tb_proj_plaats.Text; 
        plaats.Direction = ParameterDirection.Input; 
        opdrachtgever.Value = cb_proj_opdrachtgever.SelectedValue; 
        opdrachtgever.Direction = ParameterDirection.Input;
        status.Value = cb_proj_status.SelectedValue; 
        status.Direction = ParameterDirection.Input;
        proj_id.Value = id; 
        proj_id.Direction = ParameterDirection.Input;                    
        break;                 
    case 2:
        stopro = "new_bedrijf";                     
    // etc.
}

【讨论】:

  • 我认为我不得不以另一种方式执行此操作,因为我需要首先使用正确的字符串为正确的存储过程定义 sqlcommand 命令,然后我可以调用 commandparameter.add。还是有其他方法?如果可能的话,我想避免定义 command1、command2、command3 等
  • @Daanvl:你可以在 switch 语句之前创建你的SqlCommand,没有任何问题。
猜你喜欢
  • 1970-01-01
  • 2015-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-21
  • 1970-01-01
  • 2011-09-29
相关资源
最近更新 更多