c# - 程序在将数据插入数据库期间无限期地卡在 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
ExecNonQuery
dbutil 中的类:
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; }
}
解决方案
您已在连接字符串中将连接超时设置为 3600 秒(一小时)。将其设置为合理的时间,以便您可以看到失败消息以帮助找出潜在问题。
指定 Data Source=DESKTOP-KR81RU5\MSSConQLSERVER01 将导致 SqlClient 首先尝试在 UDP 端口 1434 上联系 SQL Server Browser 服务,以解析您指定的 MSSConQLSERVER01 实例的实际端口。如果 SQL Server Browser 服务未运行,它将无法将实例解析为其端口号。您需要将超时时间调低,以便您可以看到它被卡住等待的结果异常。
另一种尝试是在特定端口上配置 MSSConQLSERVER01 实例并在连接字符串中指定:Data Source=DESKTOP-KR81RU5,[port]
推荐阅读
- php - 选择框值永远不会提交到数据库中 - Laravel
- python - 如何计算从 svm.SVC 获得的轮廓内的点?
- cmake - 加载 CMakeList 永远不会完成
- sql - 如何在sql中将yyyymm转换为yyyy-mm-dd?
- opengl - 如何使用视图和投影矩阵在 OpenGL 中进行平截头体剔除?
- android - 如何测试片段场景测试中可见的矢量drawable?
- javascript - 在Javascript中将对象作为参数传递时的奇怪行为
- bash - ffmpeg 启动时间太长
- matlab - Matlab - 具有不同系数的多项式根
- json - 使用 JMESPath 和/或 Ansible 组合 JSON 项