我在Dapper .NET项目主页上找到了以下注释.
Dapper支持varchar参数,如果使用param在varchar列上执行where子句,请确保以这种方式传递它:
Query<Thing>("select * from Thing where Name = @Name", new {Name =
new DbString { Value = "abcde", IsFixedLength = true, Length = 10, IsAnsi = true });
Run Code Online (Sandbox Code Playgroud)
在Sql Server上,查询unicode和ansi查询非unicode时使用unicode至关重要
我正在评估Dapper与遗留数据库(SQL Server 2008)一起使用,其中包含许多带varchar参数的存储过程,我对此限制感到有些困惑.
使用手工制作的ADO.NET代码,我将使用以下内容进行上述查询:
new SqlParameter("@Name", "abcde")
Run Code Online (Sandbox Code Playgroud)
没有指定是否是unicode,也没有指定长度.
为什么我需要使用Dapper的详细DbString语法,指定列长度,IsFixedLength和IsAnsi?
为什么varchar列的IsFixedLength = true(我希望它对于char或nchar列是真的)?
我是否必须像这样使用DbString存储过程参数?
我期待Dapper让我的DAL代码更简洁,但这似乎使得varchar参数更加冗长.
UPDATE
我已经进行了进一步的研究,试图理解为什么Dapper会有这个varchar限制,我似乎没有在我手工编写的代码中,我通常会创建一个输入参数,如下所示:
var parameter = factory.CreateParameter(); // Factory is a DbProviderFactory
parameter.Name = ...;
parameter.Value = ...;
Run Code Online (Sandbox Code Playgroud)
并且通常让提供者推断DbType使用自己的规则,除非我特别想要强制它.
看看Dapper的DynamicParameters类,它有一个AddParameters创建参数的方法如下:
var dbType = param.DbType; // Get dbType …Run Code Online (Sandbox Code Playgroud) 我希望能够将带有标识列的表中的数据插入到SQL Server 2005中的临时表中.
TSQL看起来像:
-- Create empty temp table
SELECT *
INTO #Tmp_MyTable
FROM MyTable
WHERE 1=0
...
WHILE ...
BEGIN
...
INSERT INTO #Tmp_MyTable
SELECT TOP (@n) *
FROM MyTable
...
END
Run Code Online (Sandbox Code Playgroud)
上面的代码使用标识列创建了#Tmp_Table,然后插入失败并显示错误"只有在使用列列表且IDENTITY_INSERT为ON时,才能指定表'#Tmp_MyTable'中标识列的显式值."
TSQL中是否有一种方法可以删除临时表中列的标识属性而不显式列出所有列?我特别想使用"SELECT*",以便在将新列添加到MyTable时代码将继续工作.
我相信删除和重新创建列将改变其位置,使得无法使用SELECT*.
更新:
我已尝试在一个响应中建议使用IDENTITY_INSERT.它不起作用 - 见下面的repro.我究竟做错了什么?
-- Create test table
CREATE TABLE [dbo].[TestTable](
[ID] [numeric](18, 0) IDENTITY(1,1) NOT NULL,
[Name] [varchar](50) NULL,
CONSTRAINT [PK_TestTable] PRIMARY KEY CLUSTERED
(
[ID] ASC
)
)
GO
-- Insert some data
INSERT INTO TestTable
(Name)
SELECT 'One'
UNION …Run Code Online (Sandbox Code Playgroud) 我有一个带有MULTIPLE属性的SELECT元素.双击列表中的选项时,我想根据单击的选项执行操作.
我知道OPTION元素不处理ondblclick事件.如果我处理SELECT元素的dblclick事件,是否有某种方法可以识别哪个选项被双击?
<select size="4" name="MySelect" multiple="multiple" ondblclick="myFunction();">
<option ... />
...
</select>
Run Code Online (Sandbox Code Playgroud)
最好是跨浏览器,但IE只会这样做.
编辑
我显然不够清楚.我需要做的是确定在事件处理程序中双击哪个选项(或者双击是在没有选项的SELECT元素的区域中).由于SELECT元素具有MULTIPLE属性,因此查找selectedIndex不会这样做:如果用户在双击时按住CTRL或SHIFT,则会选择多个项目:我只想要实际双击的选项.
我开发了一个WPF UserControl,旨在用作选择列表,如下所示:
我想公开一个Command,当用户双击DataGrid中的一行时将执行该命令.然后,容器可以通过对DataGrid中的SelectedItem执行某些操作来对此做出反应.
到目前为止,我已尝试按如下方式处理双击:
<DataGrid IsReadOnly="True">
<DataGrid.InputBindings>
<MouseBinding MouseAction="LeftDoubleClick" Command="... />
</DataGrid.InputBindings>
...
Run Code Online (Sandbox Code Playgroud)
但是,当用户单击DataGrid标头时,双击事件仍会触发.我希望能够限制它,以便只在双击位于DataGrid的主体中时才执行Command.是否有声明性的方法来做到这一点?
UPDATE
我刚刚开始研究WPF和MVVM,我真的在寻找如何实现像这样的低级可重用组件的指导.任何一般性建议也将被感激地收到和投票.就目前而言,我假设我希望这个UserControl:
公开绑定到DataGrid的SelectedItem的依赖项属性"SelectedItem"
公开当用户双击行时触发的RoutedEvent"ItemDoubleClick"或类似内容.
从行双击事件处理程序实现ICommandSource和调用CommandHelpers.ExecuteCommandSource(this).
任何人都可以清楚地解释使用之间的区别
clientCredentialType=Windows,和 clientCredentialType=Ntlm托管WCF服务时在服务器端Web.config中?
我有一个SOAP 1.1(basicHttpBinding)服务,用于与现有客户端互操作.它使用ASP.NET角色,因此需要对客户端进行身份验证.
当我使用VS2005(Cassini)服务器来托管服务时,我必须ClientCredentialType=Ntlm如上所述指定,并检查VS2005中项目属性中的Ntlm身份验证框. ClientCredentialType=Windows不起作用 - 客户获得:
401未经授权的错误
但是,当我在IIS下运行时,它是另一种方式:ClientCredentialType=Windows工作,并ClientCredentialType=Ntlm失败.
任何人都可以解释这一点,并最好建议一种方法,我可以使用相同的web.config文件在Cassini和IIS中运行该服务?
更新
我的dev机器上有.NET 3.5 SP1,它是在域中运行的XP SP2.因此,Cassini在域帐户下运行,而IIS 5.1在本地帐户下运行.
我想知道它是否与这些文章中描述的.NET 3.5SP1的重大变化有关.
http://www.aspnetpro.com/newsletterarticle/2008/12/asp200812ab_l/asp200812ab_l.asp http://msmvps.com/blogs/alvin/archive/2008/11/14/net-3-5-sp1-breaking -change-to-wcf.aspx http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=354236
clientCredentialType=Windows当服务器在域帐户下运行时(这是我使用Cassini的情况 - 作为我的普通域用户帐户运行),情况听起来类似于失败,并且在本地帐户(这是我的IIS情况)下运行时工作.
问题是建议的修复程序需要更改WCF客户端配置文件 - 但在我的情况下,我使用SOAP 1.1(basicHttpBinding)与非WCF客户端.
考虑我有一个Dictionary<Key,List<item>>TestDictionary
如果我做 :
List<item> someCollection;
TestDictionary.TryGetValue(someKey,out someCollection); //assuming that someCollection will not return null;
someCollection.add(someItem);
Run Code Online (Sandbox Code Playgroud)
将对象someItem添加到Dictionary值TestDictionary [someKey]中的集合中吗?
我是一名新开发人员,我被分配了解决我们的注销功能无法正常工作的任务.我已经尝试了所有可以找到的方法.下面是我保留的日志,其中包括我使用过的方法.
在CommonHeader.ascx表单中添加了一个注销按钮
已经在logout.aspx.vb表单中尝试了许多方法来使其结束或清除会话,但它们都不起作用.
一个.logout.aspx.vb形式中定义的ClearSession子例程:
Session("Variable") = ""
FormsAuthentication.SignOut()
Session.RemoveAll()
Session.Abandon()
Session.Clear()
Run Code Online (Sandbox Code Playgroud)
湾 还将其添加到Page_Load子例程的顶部:
HttpContext.Current.Response.Cache.SetCacheability(HttpCacheability.NoCache)
HttpContext.Current.Response.Cache.SetNoServerCaching()
HttpContext.Current.Response.Cache.SetNoStore()
Run Code Online (Sandbox Code Playgroud)
C.还将ClearSession子例程更改Session.Contents.Remove("Variable")为Session("Variable") = ""
这些方法都不起作用.我们使用Siteminder,我一直想知道这是否是问题的根源.我在清除使用Siteminder的会话时找不到任何内容.另请注意,此应用程序使用Visual Studio 2003编码.
这是我在ascx文件中使用的按钮的代码:
athp:TopNavText Title ="Log Out"NavigateUrl ="logout.aspx"Target ="_ top"/
然后在"logout.aspx"表单上,我尝试使用上述方法之一或每种方法的组合.这是我触摸它之前的代码:
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
ClearSession()
Response.Redirect("login.aspx")
End Sub
Public Sub ClearSession()
Session("Variable") = ""
End Sub
Run Code Online (Sandbox Code Playgroud) 有没有一种“开箱即用”的方法来appsettings.json自动扩展值中的环境变量?
举一个人为的例子:
{
...
"MyPath1": "C:/MyApp/%ENV%/Myfolder1/MyFile1.dat",
"MyConnectionString": "Server=MyServer%ENV%..."
...
}
Run Code Online (Sandbox Code Playgroud)
我的目标是能够通过更改单个环境变量来切换我的环境,并使其影响多个 appsetting 值,而不是具有每个环境的配置文件。
更新
我查看了 JsonConfigurationProvider 的源代码,据我所知,没有开箱即用的功能。
我可以看到通过从JsonConfigurationProvider该Load()方法派生自定义类并覆盖该方法应该是可能的:
public override void Load()
{
base.Load();
foreach(var key in Data.Keys)
{
Data[key] = Environment.ExpandEnvironmentVariables(key);
}
}
Run Code Online (Sandbox Code Playgroud)
但是我对 .NET Core 配置很陌生,这导致了第二个问题:
我如何获得这个自定义实现来替换标准实现?即删除默认的 appsettings.json 和 appsettings.environment.json 提供程序并替换为自定义的。大概要添加的东西Program.cs:
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.ConfigureAppConfiguration(config =>
{
config.??? what do I need here?
}
);
Run Code Online (Sandbox Code Playgroud) 我有许多用DebuggerDisplayAttribute修饰的类.
我希望能够在单元测试中添加跟踪语句,以显示这些类的实例.
.NET Framework中是否存在一个方法,它将显示使用DebuggerDisplayAttribute格式化的对象(如果未定义DebuggerDisplayAttribute,则返回使用.ToString())?
编辑
为了澄清,我希望框架中可能有一些东西.我知道我可以从DebuggerDisplayAttribute获取Value属性,但是我需要使用DebuggerDisplayAttribute.Value表示的格式字符串来格式化我的实例.
如果我自己滚动,我会设想一个扩展方法,如下所示:
public string FormatDebugDisplay(this object value)
{
DebugDisplayAttribute attribute = ... get the attribute for value ...
if (attribute = null) return value.ToString();
string formatString = attribute.Value;
??? How do I format value using formatString ???
return SomeFormatMethod(formatString, value);
}
Run Code Online (Sandbox Code Playgroud) 我希望实现一个简单的"框架"布局,其中包含固定标题,固定左侧导航区域以及主要内容区域,如果需要,可以使用滚动条填充视口剩余部分的100%.我最好的尝试是在下面 - 但是当我向主div添加足够的内容以强制滚动时,我看到滚动条延伸到视口底部的下方.
我究竟做错了什么?或者IE6做错了什么,我该如何解决?
NB请不要建议使用更新的浏览器 - 我很乐意,但不能.
更新1(对于Matti和其他纯粹主义者!) - 我必须生活在为一个集团总部开发Web应用程序的现实限制中,该集团需要由100多个子公司的用户访问,而不是所有子公司都已升级到现代浏览器.有些子公司喜欢以浏览器不兼容为借口不使用总公司强加的申请!
更新2
我是一名应用程序开发人员,而不是网页设计师,这可能是显而易见的.到目前为止,我一直在使用DOCTYPE HTML 4.0 Transitional,我相信在所有IE版本中强制怪癖模式.但是我最近尝试添加AjaxControlToolkit ModalPopupExtender,这会在显示弹出窗口时弄乱我的布局.Google建议我需要使用XHTML 1.0来解决这个问题(AjaxControlToolkit不支持quirks模式),事实上我很乐意转向更干净的基于CSS的布局,但我确实需要我的基本框架布局才能在IE6中工作.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
<title></title>
<style type="text/css">
html, body
{
height:100%;
margin:0;
padding:0;
overflow:hidden;
}
div
{
border:0;
margin:0;
padding:0;
}
div#top
{
background-color:#dddddd;
height:100px;
}
div#left
{
background-color:#dddddd;
float:left;
width:120px;
height:100%;
overflow:hidden;
}
div#main
{
height:100%;
overflow:auto;
}
</style>
</head>
<body>
<div id="top">Title</div>
<div id="left">LeftNav</div>
<div id="main">
Content
<p>
Lorem ipsum ...
</p> …Run Code Online (Sandbox Code Playgroud)