存储过程接收文件路径参数异常:备份存默认位置且文件名仅首字符
解决存储过程备份数据库路径异常问题
你遇到的这个问题其实是SQL Server里一个很容易踩的小陷阱——NVARCHAR参数未指定长度!当你定义@FilePath nvarchar却不写长度时,SQL Server默认只会保留1个字符,这直接导致了备份路径的异常。
问题根源拆解
- 你传
N'c:\temp\backups\lob_backup.bak'时,参数只拿到了第一个字符N,所以备份文件变成了默认路径下的N文件; - 去掉N后传
'c:\temp...',第一个字符是单引号',文件名就变成了单引号,完全不符合预期。
两步解决问题
1. 修正存储过程的参数定义
给@FilePath指定足够的长度,Windows文件路径最长是260字符,所以定义成nvarchar(260)最合适:
ALTER PROCEDURE [dbo].[BackUpTo] @FilePath nvarchar(260) -- 明确指定参数长度,避免默认1字符的坑 AS BEGIN SET NOCOUNT ON; -- 建议保留,避免干扰查询结果 BACKUP DATABASE [lob] TO DISK = @FilePath; END
2. 修正C#调用代码的参数值
另外注意:不需要手动给路径加N'前缀!因为你指定了SqlDbType.NVarChar,SQL驱动会自动处理Unicode编码,直接传纯路径字符串即可,同时建议在添加参数时也指定长度,和存储过程保持一致:
try { SqlCommand cmd = new SqlCommand("BackUpTo", conn); cmd.CommandType = CommandType.StoredProcedure; // 添加参数时指定长度,和存储过程定义匹配 SqlParameter filepath = cmd.Parameters.Add("@FilePath", SqlDbType.NVarChar, 260); filepath.Direction = ParameterDirection.Input; filepath.Value = @"c:\temp\backups\lob_backup.bak"; // 直接传原始路径,不要加额外符号 conn.Open(); cmd.ExecuteNonQuery(); } finally { conn.Close(); }
额外提醒
以后定义SQL字符串类型参数时,不管是varchar还是nvarchar,一定要明确指定长度,默认长度的行为在不同场景下可能不一样,很容易引发类似的隐蔽问题。
内容的提问来源于stack exchange,提问作者Jack Tyler
相关产品推荐
相关产品推荐

