尝试从 C# 插入 SQL 行,引发异常:'System.Data.SqlClient.SqlException'
Trying to insert SQL row from C#, throws exception: 'System.Data.SqlClient.SqlException'
我是 C# 与 SQL 交互的新手,如果这里的问题很明显或重复,我深表歉意。我试图在 table 'Clientes' 中插入一个新行,此代码的第一部分连接到数据库,然后检查 table 是否有重复项,我知道这些部分有效。我把它包括在内以防万一问题可能来自我的连接字符串或其他东西。
一旦到达 Try Catch,它就会抛出我放入其中的“错误”消息,因此我知道插入时发生了故障。
通常我可以根据错误消息中的信息解决这样的问题,但这只是给我
[抛出异常:'System.Data.SqlClient.SqlException' in System.Data.dll]
在输出选项卡中,错误列表中没有任何内容,也没有我能找到的更多详细信息,而且我无法根据类似的 SO 帖子推断出问题。
if ( textBox_tel.Text.All(c => char.IsDigit(c))) //checks no letters in phone number
{
string connectionstring;
SqlConnection con;
connectionstring = @"Data Source = DRAGONSLAYER;Initial Catalog=bancodb;User id=bancodb_admin;Password=admin";
con = new SqlConnection(connectionstring);
con.Open(); //now connected to the DB
string querysignupsubmitcheck = "Select * from Clientes Where Login = '" + textBox_usr.Text + "'";
SqlDataAdapter sda_signupsubmitcheck = new SqlDataAdapter(querysignupsubmitcheck, con);
DataTable dtbl_signupsubmitcheck = new DataTable();
sda_signupsubmitcheck.Fill(dtbl_signupsubmitcheck);
con.Close();
if (dtbl_signupsubmitcheck.Rows.Count < 1) //checks the new client row isn't a duplicate
{
try
{
string querysignupsubmit = "Insert into Clientes (Nombre, Telefono, Login, Password) Values (" +
textBox_name.Text + ", " +
textBox_tel.Text + ", " +
textBox_usr.Text + ", " +
textBox_pword2.Text + ")";
SqlCommand sc_signupsubmitc = new SqlCommand(querysignupsubmit, con);
sc_signupsubmitc.ExecuteNonQuery();
this.Close();
objform_login.Show();
}
catch { label_alert.Text = "ERROR DE BASE DE DATOS"; }
}
else
{
label_alert.Text = "usuario ya existe";
}
}
else
{
label_alert.Text = "Telefono acepta solo numeros";
}
根据 another question here 上的建议,我将 try-catch 语句中的代码更改为此,但它仍然抛出相同的异常:
using (con)
{
string querysignupsubmit = "INSERT INTO Clientes (Nombre, Telefono, Login, Password) VALUES (@val1, @val2, @val3, @val4)";
using (SqlCommand sc_signupsubmit = new SqlCommand())
{
sc_signupsubmit.Connection = con;
sc_signupsubmit.CommandText = querysignupsubmit;
sc_signupsubmit.Parameters.AddWithValue("@val1", textBox_name.Text);
sc_signupsubmit.Parameters.AddWithValue("@val1", textBox_tel.Text);
sc_signupsubmit.Parameters.AddWithValue("@val1", textBox_usr.Text);
sc_signupsubmit.Parameters.AddWithValue("@val1", textBox_pword2.Text);
con.Open();
sc_signupsubmit.ExecuteNonQuery();
con.Close();
this.Close();
objform_login.Show();
}
}
感谢任何帮助或建议,这是 table 我要插入的代码:
CREATE TABLE [dbo].[Clientes] (
[ClienteID] INT IDENTITY (1, 1) NOT NULL,
[Nombre] VARCHAR (255) NOT NULL,
[Telefono] VARCHAR (20) NOT NULL,
[Login] VARCHAR (255) DEFAULT ('default_login') NOT NULL,
[Password] VARCHAR (128) NOT NULL,
CONSTRAINT [PK_Clientes] PRIMARY KEY CLUSTERED ([ClienteID] ASC)
);
编辑:
这是完整的输出和错误列表选项卡,退出消息来自我关闭它
EDIT2:我很笨,多次声明 Val1,笨笨。感谢大家的帮助。
我按照@Jamiec 的建议在我的 Catch 语句中添加了一个断点(在一对括号内右键单击)。然后,在查看调试选项卡时,我发现在输出左侧的“监视”选项卡上,我可以实时跟踪一个值。所以我向 Watch 添加了 ex
异常,然后出现了这条消息:
{"The variable name '@val1' has already been declared. Variable names must be unique within a query batch or stored procedure.\r\nMust declare the scalar variable "@val2"."}
我不小心在我的 SqlCommand
中连续四次声明 val1
并且不知何故未能在多个 read-throughs.
上注意到它
我是 C# 与 SQL 交互的新手,如果这里的问题很明显或重复,我深表歉意。我试图在 table 'Clientes' 中插入一个新行,此代码的第一部分连接到数据库,然后检查 table 是否有重复项,我知道这些部分有效。我把它包括在内以防万一问题可能来自我的连接字符串或其他东西。
一旦到达 Try Catch,它就会抛出我放入其中的“错误”消息,因此我知道插入时发生了故障。
通常我可以根据错误消息中的信息解决这样的问题,但这只是给我
[抛出异常:'System.Data.SqlClient.SqlException' in System.Data.dll]
在输出选项卡中,错误列表中没有任何内容,也没有我能找到的更多详细信息,而且我无法根据类似的 SO 帖子推断出问题。
if ( textBox_tel.Text.All(c => char.IsDigit(c))) //checks no letters in phone number
{
string connectionstring;
SqlConnection con;
connectionstring = @"Data Source = DRAGONSLAYER;Initial Catalog=bancodb;User id=bancodb_admin;Password=admin";
con = new SqlConnection(connectionstring);
con.Open(); //now connected to the DB
string querysignupsubmitcheck = "Select * from Clientes Where Login = '" + textBox_usr.Text + "'";
SqlDataAdapter sda_signupsubmitcheck = new SqlDataAdapter(querysignupsubmitcheck, con);
DataTable dtbl_signupsubmitcheck = new DataTable();
sda_signupsubmitcheck.Fill(dtbl_signupsubmitcheck);
con.Close();
if (dtbl_signupsubmitcheck.Rows.Count < 1) //checks the new client row isn't a duplicate
{
try
{
string querysignupsubmit = "Insert into Clientes (Nombre, Telefono, Login, Password) Values (" +
textBox_name.Text + ", " +
textBox_tel.Text + ", " +
textBox_usr.Text + ", " +
textBox_pword2.Text + ")";
SqlCommand sc_signupsubmitc = new SqlCommand(querysignupsubmit, con);
sc_signupsubmitc.ExecuteNonQuery();
this.Close();
objform_login.Show();
}
catch { label_alert.Text = "ERROR DE BASE DE DATOS"; }
}
else
{
label_alert.Text = "usuario ya existe";
}
}
else
{
label_alert.Text = "Telefono acepta solo numeros";
}
根据 another question here 上的建议,我将 try-catch 语句中的代码更改为此,但它仍然抛出相同的异常:
using (con)
{
string querysignupsubmit = "INSERT INTO Clientes (Nombre, Telefono, Login, Password) VALUES (@val1, @val2, @val3, @val4)";
using (SqlCommand sc_signupsubmit = new SqlCommand())
{
sc_signupsubmit.Connection = con;
sc_signupsubmit.CommandText = querysignupsubmit;
sc_signupsubmit.Parameters.AddWithValue("@val1", textBox_name.Text);
sc_signupsubmit.Parameters.AddWithValue("@val1", textBox_tel.Text);
sc_signupsubmit.Parameters.AddWithValue("@val1", textBox_usr.Text);
sc_signupsubmit.Parameters.AddWithValue("@val1", textBox_pword2.Text);
con.Open();
sc_signupsubmit.ExecuteNonQuery();
con.Close();
this.Close();
objform_login.Show();
}
}
感谢任何帮助或建议,这是 table 我要插入的代码:
CREATE TABLE [dbo].[Clientes] (
[ClienteID] INT IDENTITY (1, 1) NOT NULL,
[Nombre] VARCHAR (255) NOT NULL,
[Telefono] VARCHAR (20) NOT NULL,
[Login] VARCHAR (255) DEFAULT ('default_login') NOT NULL,
[Password] VARCHAR (128) NOT NULL,
CONSTRAINT [PK_Clientes] PRIMARY KEY CLUSTERED ([ClienteID] ASC)
);
编辑:
这是完整的输出和错误列表选项卡,退出消息来自我关闭它
EDIT2:我很笨,多次声明 Val1,笨笨。感谢大家的帮助。
我按照@Jamiec 的建议在我的 Catch 语句中添加了一个断点(在一对括号内右键单击)。然后,在查看调试选项卡时,我发现在输出左侧的“监视”选项卡上,我可以实时跟踪一个值。所以我向 Watch 添加了 ex
异常,然后出现了这条消息:
{"The variable name '@val1' has already been declared. Variable names must be unique within a query batch or stored procedure.\r\nMust declare the scalar variable "@val2"."}
我不小心在我的 SqlCommand
中连续四次声明 val1
并且不知何故未能在多个 read-throughs.