将'\'(反斜杠)字符传递给存储过程

时间:2018-04-23 13:52:16

标签: c# winforms stored-procedures sql-server-2008-r2 escaping

我在Active Directory环境中有一个WinForm应用程序。其中一个表单用作用户管理,用户名存储在2008R2 SQL Server DB的表中

CREATE TABLE Users (
    ID int IDENTITY(0,1) PRIMARY KEY,
    DOMAINUSERNAME nvarchar(15) NOT NULL,
    ID_ROLE int NOT NULL,
    USER nvarchar(15) NOT NULL,
    CREATED datetime NOT NULL,
    CONSTRAINT UC_User UNIQUE (DOMAINUSERNAME)
    );

其值通过存储过程插入

CREATE PROCEDURE spENABLE (
    @DOMAINUSERNAME nvarchar(7),
    @ROLE int,
    @USER nvarchar(15))
AS
    INSERT INTO Users(
        DOMAINUSERNAME,
        ID_ROLE,
        USER,
        CREATED)
    VALUES (
        @DOMAINUSERNAME,
        @ROLE,
        @USER,
        GETDATE())

在应用程序域上,这些是显示如何创建域用户名字符串的相关行

string username = txtNewUser.Text.ToUpper();
string DomainUsername = String.Concat(@"MYDOMAIN\", username);
Roles Role = (Roles)cmbRoles.SelectedIndex;

DataBase.EnableUser(DomainUsername, Role, CurrentUser); //calls the sproc

这就是调用存储过程的方式

public static void EnableUser(string _domainuser, Roles _role, string _currentuser)
{
    using (SqlCommand cmd = new SqlCommand("spENABLE", connection))
    {
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Parameters.Add("@DOMAINUSERNAME", SqlDbType.NVarChar).Value = _domainuser;
        cmd.Parameters.Add("@ROLE", SqlDbType.Int).Value = (int)_role;
        cmd.Parameters.Add("@USER", SqlDbType.NVarChar).Value = _currentuser;
        cmd.ExecuteNonQuery();
    }
}

现在,这是(对我而言)意想不到的结果:

ID  DOMAINUSERNAME  ROLE    USER            CREATED
-------------------------------------------------------------------
1   MYDOMAIN\       0       MYDOMAIN\USER   2018-04-23 15:03:18.040

我确定_domainuser参数不为空,因此存储过程必须删除域用户名的用户名部分。另一方面,当前的用户名 - 以相同的方式构建! - 正确插入。也许它与约束有关?

提前致谢。

1 个答案:

答案 0 :(得分:1)

尝试将@DOMAINUSERNAME参数的类型从nvarchar(7)更改为nvarchar(15)

CREATE PROCEDURE spENABLE (
    @DOMAINUSERNAME nvarchar(15),
    @ROLE int,
    @USER nvarchar(15))
AS
...

nvarchar(7)只能存储最大长度为7的字符串,这解释了@DOMAINUSERNAME值(但不是@USER值)被截断的原因。