SqlDbType.VarChar的问题

 

ShangPinBianHao字段是 nchar 10,
sqlCommand = new SqlCommand(@"SELECT GUID, ShangPinBianHao, ShangPinMingCheng FROM stock_ShangPinXinXi WHERE (ShangPinBianHao LIKE @ShangPinBianHao + N'%')", conn);
这是使用Char,NChar都失败了,只取得了"="查询的值
sqlCommand.Parameters.Add(new SqlParameter("@ShangPinBianHao", SqlDbType.NVarChar, 10));
......


从微软论坛上获得的帮助是:
char、nchar 长度固定(比如,存储字符串“abc",对于CHAR (20),表示你存储的字符将占20个字节包括17个空字符);
varchar、nvarchar 是可变长度
nchar、nvarchar 用于存储  Unicode 字符,比如中文

根据上面的描述,两者最终形成SQL的差另如下。
使用 char(10) 、Nchar(10) 作为参数类型时最终解释的 SQL 为 Where ShangPinBianHao LIKE '1        ' + N'%'
使用 varchar(10) 、Nvarchar(10) 作为参数类型时最终解释的 SQL 为 Where ShangPinBianHao LIKE '1' + N'%'

结论:
    根据经验 "="查询是会Trim()空格的,就不难看出为什么用Char,NChar只取得了=查询的值


又问:
  sqlCommand.Parameters.Add(new SqlParameter("@ShangPinBianHao", SqlDbType.VarChar, 10));
或者
  sqlCommand.Parameters.Add(new SqlParameter("@ShangPinBianHao", SqlDbType.Char, 10));
我输入了10个中文字,为什么没有溢出呢?

答曰:
SELECT语句不会报错,Insert语句会报错。

现在有.net6开发的api接口 代码如下using Microsoft.AspNetCore.Mvc; using Microsoft.Data.SqlClient; using Microsoft.EntityFrameworkCore; using NHisApi.Models; using System.Data; namespace NHisApi.Controllers { [ApiController] [Route("api/[controller]")] public class NewClinicLabController : ControllerBase { private readonly HisContext _context; public NewClinicLabController(HisContext context) { _context = context; } public class sqd { public string patid { get; set;} public string ysdm { get; set;} public string ghks { get; set;} public string jzhm { get; set;} public string ztbh { get; set;} public string ztmc { get; set;} public string icd { get; set;} public string jbzd { get; set;} public string? jybs { get; set;} public string? jcmd { get; set;} public string? jczysx { get; set;} public string? bblx { get; set;} } [HttpPost("")] public async Task<IActionResult> NewClinicLab([FromBody] List<sqd> request) { try { var outputParam = new SqlParameter { ParameterName = "@output", SqlDbType = SqlDbType.VarChar, Size = 50, Direction = ParameterDirection.Output }; var checkIdParam = new SqlParameter { ParameterName = "@checkid", SqlDbType = SqlDbType.VarChar, Size = 50, Direction = ParameterDirection.Output }; foreach (var sqd in request) { var parameters = new[] { new SqlParameter("@patid",sqd.patid), new SqlParameter("@ysdm",sqd.ysdm), new SqlParameter("@ghks",sqd.ghks), new SqlParameter("@jzxh",sqd.jzhm), new SqlParameter("@ztbh",sqd.ztbh), new SqlParameter("@ztmc",sqd.ztmc), new SqlParameter("@icd",sqd.icd), new SqlParameter("@jbzd",sqd.jbzd), new SqlParameter("@jybs",sqd.jybs), new SqlParameter("@jcmd",sqd.jcmd), new SqlParameter("@jczysx",sqd.jczysx), new SqlParameter("@bblx",sqd.bblx), outputParam, checkIdParam }; await _context.Database.ExecuteSqlRawAsync("exec Clinic_lab_Insert_Nhis @patid,@ysdm,@ghks,@jzxh,@ztbh,@ztmc,@icd,@jbzd,@jybs,@jcmd,@jczysx,@bblx,@output output,@checkid output", parameters); } return Ok(new { resultcode = 200, message = "保存成功" }); } catch (Exception ex) { return StatusCode(500, new { resultcode = 500, message = "失败", error = ex.Message }); } } } } 我需要在执行Clinic_lab_Insert_Nhis这个存储过程后调用api接口 地址为 http://10.0.4.173:5000/api/addlis 入参为{ "jzhm":"", "doccode":"" }
最新发布
03-08
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值