首页 > 解决方案 > 程序在将数据插入数据库期间无限期地卡在 connection.Open() 上

问题描述

我目前正在使用 .NET 开发 Web API。我正在使用 SQL Server 连接到数据库。对于插入数据和从数据库中选择数据,我使用存储过程。问题是当我试图将数据插入数据库并且编译器处于调试模式时,调试将停留在

 connection.Open(); 

dbUtil文件中。不会抛出异常,程序将无限期挂起。

连接字符串:

<connectionStrings>
    <add name="_cs" 
         connectionString="Data Source=DESKTOP-KR81RU5\MSSConQLSERVER01;Initial Catalog=HISDB;Integrated Security=True;Connect Timeout=3600;User Id=TaqiuddinShokordey;Password=XXXX;" 
         providerName="System.Data.SqlClient" />
</connectionStrings>

存储过程:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE [dbo].[SSO_Register]
    @customer_id nvarchar(255),
    @secure_word nvarchar(255),
    @full_name nvarchar(255),
    @phone_number nvarchar(255),
    @nationality nvarchar(255),
    @id_number nvarchar(255),
    @dob nvarchar(255),
    @email nvarchar(255),
    @user_id nvarchar(255),
    @provider_id nvarchar(255),
    @temp_token nvarchar(255),
    @tac nvarchar(6),
    @gender nvarchar(255)
AS
BEGIN
    SET NOCOUNT OFF;

    UPDATE ST_YIBANCANSHU 
    SET @customer_id = (SELECT CONCAT(parmvalstr1, FORMAT(parmvalint,parmvalstr2), '_', YEAR(GETDATE())) 
                        FROM ST_YIBANCANSHU 
                        WHERE parmtyp = 'RUNNING_NUM' AND parmkey = 'GUKE'), 
        parmvalint = parmvalint + 1
    WHERE parmtyp = 'RUNNING_NUM' AND parmkey = 'GUKE'
    
    -- Insert statements for procedure here
    INSERT INTO SSO (CUSTOMER_ID, SECURE_WORD, FULL_NAME, PHONE_NUMBER, NATIONALITY, ID_NUMBER, DOB, EMAIL, GENDER)
    VALUES (@customer_id, @secure_word, @full_name, @phone_number, @nationality, @id_number, @dob, @email, @gender)

    INSERT INTO ACCOUNT_INFO (CUSTOMER_ID, USER_ID, PROVIDER_ID, TEMP_TOKEN, TAC)
    VALUES (@customer_id, @email, @provider_id, @temp_token, @tac)
END

ExecNonQuerydbutil 中的类:

public void ExecNonQuery(string sp, SqlParameter[] parm)
{
        using (SqlConnection connection = new SqlConnection(_cs))
        {
            using (SqlCommand command = new SqlCommand(sp, connection))
            {
                command.CommandType = CommandType.StoredProcedure;
                command.CommandTimeout = 120;
                connection.Open();

                if (parm != null)
                {
                    for (int i = 0; i < parm.Length; i++)
                        command.Parameters.Add(parm[i]);
                }

                command.ExecuteNonQuery();
            }
        }
}

doRegister方法:

public bool doRegister(SSO_Model objsso)
{
        bool _return = false;

        try
        {
            string tac = " ";
            string temp_token = " ";
            Test util = new Test();
            tac = Test.getTac();
            temp_token = Test.generateTempToken(objsso.secure_word, objsso.secure_word);

            SqlParameter[] parm =
            {
                new SqlParameter("customer_id", objsso.customer_id),
                new SqlParameter("full_name", objsso.full_name),
                new SqlParameter("phone_number", objsso.phone_number),
                new SqlParameter("gender", objsso.gender),
                new SqlParameter("id_number", objsso.id_number),
                new SqlParameter("secure_word", objsso.secure_word),
                new SqlParameter("nationality", objsso.nationality),
                new SqlParameter("dob", objsso.dob),
                
                new SqlParameter("email", objsso.email),
                new SqlParameter("user_id", objsso.email),
                
                new SqlParameter("provider_id", objsso.provider_id),
                new SqlParameter("temp_token", temp_token),
                new SqlParameter("tac", tac)
        };

        var connectionString = System.Configuration.ConfigurationManager.
        ConnectionStrings["_cs"].ConnectionString;

        dbUtil db = new dbUtil(connectionString);
        db.ExecNonQuery("SSO_Register", parm);
        _return = true;
    }
    catch (Exception ex)
    {
        _return = false;
        throw ex;
    }

    return _return;
}

型号类:

public class SSO_Model
{
    public string customer_id { get; set; }
    public string secure_word { get; set; }
    public string full_name { get; set; }
    public string phone_number { get; set; }
    public string gender { get; set; }
    public string id_number { get; set; }
    public string dob { get; set; }
    public string nationality { get; set; }
    public string email { get; set; }
    public string provider_id { get; set; }
}

标签: c#sql-server

解决方案


您已在连接字符串中将连接超时设置为 3600 秒(一小时)。将其设置为合理的时间,以便您可以看到失败消息以帮助找出潜在问题。

指定 Data Source=DESKTOP-KR81RU5\MSSConQLSERVER01 将导致 SqlClient 首先尝试在 UDP 端口 1434 上联系 SQL Server Browser 服务,以解析您指定的 MSSConQLSERVER01 实例的实际端口。如果 SQL Server Browser 服务未运行,它将无法将实例解析为其端口号。您需要将超时时间调低,以便您可以看到它被卡住等待的结果异常。

另一种尝试是在特定端口上配置 MSSConQLSERVER01 实例并在连接字符串中指定:Data Source=DESKTOP-KR81RU5,[port]


推荐阅读