它只nvarchar支持多字节字符吗?如果是这种情况,除了存储问题之外,还有什么意义varchars吗?
我通常在ADO.NET中创建参数时设置列大小
但是如果列是什么尺寸我会使用VARCHAR(MAX)?
cmd.Parameters.Add("@blah", SqlDbType.VarChar, ?????).Value = blah;
Run Code Online (Sandbox Code Playgroud) 将参数传递给SQLCommand的最佳方法是什么?你可以做:
cmd.Parameters.Add("@Name", SqlDbType.VarChar, 20).Value = "Bob";
Run Code Online (Sandbox Code Playgroud)
要么
cmd.Parameters.Add("@Name", SqlDbType.VarChar).Value = "Bob";
Run Code Online (Sandbox Code Playgroud)
要么
cmd.Parameters.Add("@Name").Value = "Bob";
Run Code Online (Sandbox Code Playgroud)
看起来第一个可能在某种程度上"更好",无论是性能方面还是错误检查方式.但我想更清楚地知道.
有一个相关的问题:
但我想知道差异是什么,以及不同方式是否存在任何问题.
我通常使用这样的结构:
using (SqlConnection conn = new SqlConnection(connectionString))
using (SqlCommand cmd = new SqlCommand(SQL, conn))
{
cmd.CommandType = CommandType.Text;
cmd.CommandTimeout = Settings.Default.reportTimeout;
cmd.Parameters.Add("type", SqlDbType.VarChar, 4).Value = type;
cmd.Connection.Open();
using (SqlDataAdapter adapter = new SqlDataAdapter(cmd))
{
adapter.Fill(ds);
}
//use data
}
Run Code Online (Sandbox Code Playgroud)
现在有几种方法可以添加cmd参数,我想知道哪个是最好的:
cmd.Parameters.Add("@Name", SqlDbType.VarChar, 20).Value = "Bob";
cmd.Parameters.Add("@Name", SqlDbType.VarChar).Value = "Bob";
cmd.Parameters.Add("@Name").Value = "Bob";
cmd.Parameters.AddWithValue("@Name", "Bob");
Run Code Online (Sandbox Code Playgroud)
在我假设的变量传递中具有字段的长度是不可取的,因为它是可以在数据库中稍后更改的魔术值.它是否正确?它是否会导致以这种方式(性能或其他)传递varchar的任何问题,我假设它默认为varchar(max)或数据库等效.我很高兴这会奏效.
更关心我的部分是如果我使用上面列出的第三或第四个选项,则丢失SqlDbType枚举我根本不提供类型.有没有这种情况不起作用的情况我可以想象varchar被错误地转换为char或者反之亦然的问题,或者可能是带有小数的问题....
就数据库而言,我认为字段类型的变化远不如长度,因此值得保留?
我试图将表值参数传递给存储过程,但我不断得到一个异常(见下文).
SqlCommand c = new SqlCommand("getPermittedUsers", myConn) { CommandType = CommandType.StoredProcedure };
c.Parameters.AddWithValue("@intNotifyingUserId", notifyingUserId);
c.Parameters.AddWithValue("@tSelectedPdfIds", sharedPdfs).SqlDbType = SqlDbType.Structured;
SqlDataReader dr = c.ExecuteReader();Run Code Online (Sandbox Code Playgroud)
类型在服务器上定义如下:
CREATE TYPE [dbo].[IdList] AS TABLE(
[Id] [int] NOT NULL
)Run Code Online (Sandbox Code Playgroud)
我试图通过sharedPdfs为List<int>,和IQueryable<int>,但不断收到以下异常:
Object must implement IConvertible.
谁知道我做错了什么?文档暗示我应该能够将列表作为TVP传递但不提供任何示例.
谢谢.