我是C#编程的新手,而且我一直在研究所有网站,我找到了一个答案,这是我正在搜索的答案,但此刻我把它付诸实践它没有用。
问题是我有一个页面,你必须输入你的用户号和你的合同类型,这两个合并是一个表中的键,所以当你点击按钮,如果用户已经存在于表中它需要显示一条消息"用户已经存在!"否则它需要将数据发送到另一个页面。
这是我已有的代码:
protected void Button1_Click(object sender, EventArgs e)
{
SqlConnection cn = new SqlConnection("Data Source=;Initial Catalog=Sales;User ID=;Password=");
SqlCommand cmd = new System.Data.SqlClient.SqlCommand("CheckUserDataBase", cn);
cmd.CommandType = CommandType.StoredProcedure;
SqlParameter parm = new SqlParameter("@User",SqlDbType.VarChar);
parm.Value = "'" + EmployeeNo.Text + "" + ContractType.Text + "'";
parm.Size=25;
parm.Direction = ParameterDirection.Input ;
cmd.Parameters.Add(parm);
SqlParameter parm2 = new SqlParameter("@Exists",SqlDbType.Int);
parm2.Direction = ParameterDirection.Output;
cmd.Parameters.Add(parm2);
cn.Open();
cmd.ExecuteNonQuery();
cn.Close();
int IsExists = Convert.ToInt32(cmd.Parameters["@Exists"].Value.ToString());
if (IsExists == 0)
{
Page.ClientScript.RegisterStartupScript(this.GetType(),"Scripts","<script>alert('The User already Exists!')</script>");
}
else if (IsExists == 1)
{
Response.Redirect("Data.aspx?NumEmp=" + EmployeeNumber+ "&ContractType=" + ContractType);
}
这是我找到的存储过程:
ALTER PROCEDURE [dbo].[CheckUserDataBase]
(@User AS VARCHAR(25),
@Exists AS INT OUT)
AS
BEGIN
IF EXISTS (SELECT *
FROM GeneralData
WHERE EmployeeeNo+ContractType = @User)
BEGIN
SET @Exists = 1
END
END
我的所有其他代码部分都已经有效,但现在我已经陷入了使用SQL的验证过程中,我将非常感谢您的帮助。
问候!
答案 0 :(得分:1)
我不清楚问题究竟在哪里,但我确实在此代码中看到了几个问题。也许其中一个可以解决您的问题。
首先,在使用查询参数时,您不需要将参数值括在单引号中。我还注意到这一行有一个错误的参数:
SqlParameter parm= new SqlParameter("@User, cn",SqlDbType.VarChar);
我们可以选择一个记录计数,并检查它,而不是使用输出参数,以获得更自然的查询,并避免在NULL的情况下需要将结果转换为整数。
最后,我从存储过程中看到,您组合的两个字段实际上是表中的单独列。考虑到这一点,通过将两个字段实际发送为单独的参数,您还可以获得 MUCH 更好的性能。
此处的代码可以解释这些变化。我不得不猜测如何在两个字段之间划分25个字符:
ALTER PROCEDURE [dbo].[CheckUserDataBase]
(
@EmpNo AS VARCHAR(15), @ContractType AS VARCHAR(10)
)
AS
BEGIN
select count(*)
from GeneralData
where EmployeeeNo = @EmpNo
AND ContractType= @ContractType
END
protected void Button1_Click(object sender, EventArgs e)
{
int results = 0;
using (var cn = new SqlConnection("Data Source=;Initial Catalog=Sales;User ID=;Password="))
using (var cmd = new SqlCommand("CheckUserDataBase", cn))
{
cmd.CommandType=CommandType.StoredProcedure;
cmd.Parameters.Add("@EmpNo", SqlDbType.VarChar, 15).Value = EmployeeNo.Text;
cmd.Parameters.Add("@ContractType", SqlDbType.VarChar, 10).Value = ContractType.Text;
cn.Open();
results = (int)cmd.ExecuteScalar();
}
if (results > 0)
{
Page.ClientScript.RegisterStartupScript(this.GetType(),"Scripts","<script>alert('The User already Exists!')</script>");
}
else
{
Response.Redirect(String.Format("Data.aspx?NumEmp={0}&ContractType={1}",
Server.UrlEncode(EmployeeNumber), Server.UrlEncode(ContractType)));
}
}
答案 1 :(得分:0)
根据您的暗示,我相信您的努力就是验证。在执行其他任务之前,确定是否存在所述数据。你可以通过多种方式实现这一目标,但我相信你的希望是:
ExecuteScalar
SqlDataReader
因此,在我的示例中,我将确定用户名是否已存在。
private readonly string dbConnection = ...;
private const string validateUserQuery = "...;";
public bool ValidateUser(string user)
{
using(var connection = new SqlConnection(dbConnection));
using(var command = new SqlCommand(validateUserQuery, connection))
{
connection.Open();
command.Parameters.Add("@User", SqlDbType.NVarChar, 50).Value = user;
var result = command.ExecuteScalar() as string;
if(!string.IsNullOrEmpty(result))
return true;
}
return false;
}
因此,在这种情况下,ExecuteScalar
应为用户名返回string
,如果失败,则会使用null
。所以我们确定它是否存在,它将返回true。否则返回false。