我是C#编程的新手,所以如果有人能帮助我,我将不胜感激。我知道有类似的问题,但我仍然无法找到我的问题的解决方案。我正在开发一个模拟系统,当用户购买产品时,系统将存储所有交易细节。问题是,我无法将数据插入数据库。这是代码:
using (SqlConnection conn = new SqlConnection
(ConfigurationManager.ConnectionStrings["database"].ConnectionString))
{
string QueryA = "@Insert into TransDetails(AccountNumber,Amount,Provider"
+ ",Mobile Number,TransNum,TransDate, Status) "
+ " Values (@AccountNumber,@Amount,@Provider,@Mobile Number,"
+ "@TransNum,@TransDate,@Status";
using (SqlCommand cmd = new SqlCommand("InsertRecord", conn))
{
conn.Open();
cmd.CommandType = CommandType.Text;
cmd.CommandText = QueryA;
cmd.Parameters.AddWithValue("@AccountNumber", acc.Text);
cmd.Parameters.AddWithValue("@Amount", lblAmount.Text);
cmd.Parameters.AddWithValue("@Provider", lblProvider.Text);
cmd.Parameters.AddWithValue("@Mobile Number", lblNumber.Text);
cmd.Parameters.AddWithValue("@TransNum", lblTrans.Text);
cmd.Parameters.AddWithValue("@TransDate", lblDate.Text);
cmd.Parameters.AddWithValue("@Status", status.Text);
try
{
conn.Open();
cmd.ExecuteNonQuery();
}
catch
{
lblMessage.Text = "Error";
}
finally
{
conn.Close();
}
}
}
并且商店程序如下:
ALTER PROCEDURE InsertRecord1
@AccountNumber int,
@Amount nchar(10),
@Provider nchar(10),
@MobileNumber int,
@TransNum nchar(10),
@TransDate date,
@Status nchar(10)
AS
Insert into TransDetails(AccountNumber,Amount,Provider,MobileNumber,TransNum,TransDate,Status)
Values (@AccountNumber,@Amount,@Provider,@MobileNumber,@TransNum,@TransDate,@Status)
return
真的很感激任何帮助。 P / S:我不知道为什么存储过程的开始以“alter”开头。
答案 0 :(得分:1)
您必须在括号
时转义Mobile Number
Insert into TransDetails(AccountNumber,Amount,Provider,[Mobile Number],...
并删除parameter
...,@MobileNumber,@TransNum,@TransDate,@Status
并更改命令参数
中的参数名称cmd.Parameters.AddWithValue("@MobileNumber", lblNumber.Text);
但是看到您的stored procedure
,列Mobile Number
之间没有空格。在QueryA
的查询中是否出现拼写错误?如果是,则删除其上的空格(也在参数名称上)
Insert into TransDetails(AccountNumber,Amount,Provider,MobileNumber,...
或
将您的CommandType.Text
更改为CommandType.StoredProcedure
并删除此行
cmd.CommandText = QueryA;
答案 1 :(得分:1)
我可能读错了,但看起来你的存储过程根本就没用过。尝试注释掉“cmd.CommandText = QueryA;”并替换“cmd.CommandText =”InsertRecord1“;”并将CommandType更改为StoredProcedure。
顺便说一下,QueryA最后错过了一个paren。但是,整个过程是不必要的,因为你有一个存储过程做同样的事情,并且几乎总是更喜欢使用存储过程而不是嵌入式DML。答案 2 :(得分:0)
您正在使用SqlCommand
构造函数的错误重载。根据MSDN:
new SqlCommand(string,SqlConnection)使用查询文本和SqlConnection初始化SqlCommand类的新实例。
您需要做的是将sql命令的CommandType
设置为CommandType.StoredProcedure
而不使用QueryA
,或者使用QueryA
初始化sql命令而不是make使用您的存储过程。
答案 3 :(得分:0)
正如您所看到的,在SQL语句的开头有 @ 。
此外,您还没有真正使用商店程序。
答案 4 :(得分:0)
你可以试试这个:
using (SqlConnection conn = new SqlConnection (ConfigurationManager.ConnectionStrings["database"].ConnectionString))
{
conn.Open();
SqlCommand cmd = new SqlCommand("InsertRecord1", conn);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@AccountNumber", acc.Text);
cmd.Parameters.AddWithValue("@Amount", lblAmount.Text);
cmd.Parameters.AddWithValue("@Provider", lblProvider.Text);
cmd.Parameters.AddWithValue("@Mobile Number", lblNumber.Text);
cmd.Parameters.AddWithValue("@TransNum", lblTrans.Text);
cmd.Parameters.AddWithValue("@TransDate", lblDate.Text);
cmd.Parameters.AddWithValue("@Status", status.Text);
try
{
cmd.ExecuteNonQuery();
}
catch
{
lblMessage.Text = "Error";
}
finally
{
conn.Close();
}
}
我不使用SQL命令,适配器等。从SQL数据库访问数据。我更喜欢Microsoft Data Access ApplicationBlocks,它是Microsoft提供的易于使用的库,用于从SQL Server访问数据。
下载强> 您可以在此处下载http://download.microsoft.com/download/VisualStudioNET/daabref/RTM/NT5/EN-US/DataAccessApplicationBlock.msi
<强>简介强> http://www.4guysfromrolla.com/articles/062503-1.aspx