将“\”(反斜杠)字符传递给存储过程
Passing '\' (backslash) character to a stored procedure
我在 Active Directory 环境中有一个 WinForm 应用程序。其中一种形式用作用户管理,用户名存储在2008R2 SQL Server DB
中的table中
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
参数不为空,因此存储过程必须删除域用户名的用户名部分。另一方面,当前用户名 - 以相同的方式构建! - 正确插入。可能跟约束有关?
提前致谢。
尝试将 @DOMAINUSERNAME
参数的类型从 nvarchar(7)
更改为 nvarchar(15)
:
CREATE PROCEDURE spENABLE (
@DOMAINUSERNAME nvarchar(15),
@ROLE int,
@USER nvarchar(15))
AS
...
nvarchar(7)
只能存储最大长度为 7 的字符串,这解释了为什么 @DOMAINUSERNAME
值(而不是 @USER
值)被截断的原因。
我在 Active Directory 环境中有一个 WinForm 应用程序。其中一种形式用作用户管理,用户名存储在2008R2 SQL Server DB
中的table中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
参数不为空,因此存储过程必须删除域用户名的用户名部分。另一方面,当前用户名 - 以相同的方式构建! - 正确插入。可能跟约束有关?
提前致谢。
尝试将 @DOMAINUSERNAME
参数的类型从 nvarchar(7)
更改为 nvarchar(15)
:
CREATE PROCEDURE spENABLE (
@DOMAINUSERNAME nvarchar(15),
@ROLE int,
@USER nvarchar(15))
AS
...
nvarchar(7)
只能存储最大长度为 7 的字符串,这解释了为什么 @DOMAINUSERNAME
值(而不是 @USER
值)被截断的原因。