常见.NET功能代码汇总
1,在Web上修改指定文件位置的Web.config
这里需要使用 WebConfigurationManager 类,但必须使用WebConfigurationFileMap类来指定文件位置,看代码:
long appId = ; //修改网站的配置文件
var configFile = new FileInfo(configFilePath);
var vdm = new VirtualDirectoryMapping(configFile.DirectoryName, true, configFile.Name);
var wcfm = new WebConfigurationFileMap();
wcfm.VirtualDirectories.Add("/", vdm);
var config = WebConfigurationManager.OpenMappedWebConfiguration(wcfm, "/", siteName);
AppSettingsSection appSection = (AppSettingsSection)config.GetSection("appSettings");
appSection.Settings["abc"].Value = "system tag";
appSection.Settings["appId"].Value = appId.ToString();
config.Save();
上面的代码参考自 stackoverflow ,但是OpenMappedWebConfiguration 必须指定第3个参数,否则会报错。不过,siteName 并不要求与IIS的站点名字对应,随意写一个也可以。
2,使用angularJS 绑定站点信息
首先定义一个 webSiteListApp HTML代码片断:
<div ng-app="webSiteListApp" class="container">
<div ng-controller="webSiteListController">
<ul>
<li ng-repeat="item in siteList">
站点名:{{item.SiteName}} ------绑定信息:{{item.DomainPort}}
</li>
</ul>
</div>
</div>
然后定义module和service:
<script type="text/javascript">
// 参考 http://www.infragistics.com/community/blogs/dhananjay_kumar/archive/2015/05/13/how-to-use-angularjs-in-asp-net-mvc-and-entity-framework-4.aspx var webSiteListApp = angular.module("webSiteListApp", []);
webSiteListApp.controller("webSiteListController", function ($scope, webSiteService) {
getSiteList();
function getSiteList() {
var list = webSiteService.getSiteList()
.success(function (sites) {
$scope.siteList = sites;
console.log($scope.siteList);
})
.error(function (error) {
$scope.status = 'Unable to load customer data: ' + error.message;
console.log($scope.status);
}); }
});
webSiteListApp.factory("webSiteService", ["$http", function ($http) {
var webSiteService = {};
webSiteService.getSiteList = function () {
return $http.get("/SiteManage/GetServerBindings");
}
return webSiteService;
}]);
</script>
这里定义了一个叫做 webSiteListApp 的module,然后注册一个 webSiteListController 的控制器,该控制器在前面的HTMl代码中定义,最后创建一个 webSiteService ,它监听后来MVC来的数据,该数据对应的ASP.NET MVC 方法如下:
public JsonResult GetServerBindings()
{
var siteList = IISControlHelper.IISWorker.GetServerBindings();
return Json(siteList, JsonRequestBehavior.AllowGet);
}
3,IIS管理程序
可以创建,删除网站,添加应用程序池,代码如下:
using System;
using System.Collections;
using System.Collections.Generic;
using System.DirectoryServices;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks; namespace IISControlHelper
{
/// <summary>
/// IIS 操作方法集合
/// http://blog.csdn.net/ts1030746080/article/details/8741399 错误
/// </summary>
public class IISWorker
{
private static string HostName = "localhost"; /// <summary>
/// 获取本地IIS版本
/// </summary>
/// <returns></returns>
public static string GetIIsVersion()
{
try
{
DirectoryEntry entry = new DirectoryEntry("IIS://" + HostName + "/W3SVC/INFO");
string version = entry.Properties["MajorIISVersionNumber"].Value.ToString();
return version;
}
catch (Exception se)
{
//说明一点:IIS5.0中没有(int)entry.Properties["MajorIISVersionNumber"].Value;属性,将抛出异常 证明版本为 5.0
return string.Empty;
}
} /// <summary>
/// 创建虚拟目录网站
/// </summary>
/// <param name="webSiteName">网站名称</param>
/// <param name="physicalPath">物理路径</param>
/// <param name="domainPort">站点+端口,如192.168.1.23:90</param>
/// <param name="isCreateAppPool">是否创建新的应用程序池</param>
/// <returns></returns>
public static int CreateWebSite(string webSiteName, string physicalPath, string domainPort,bool isCreateAppPool)
{
DirectoryEntry root = new DirectoryEntry("IIS://" + HostName + "/W3SVC");
// 为新WEB站点查找一个未使用的ID
int siteID = ;
foreach (DirectoryEntry e in root.Children)
{
if (e.SchemaClassName == "IIsWebServer")
{
int ID = Convert.ToInt32(e.Name);
if (ID >= siteID) { siteID = ID + ; }
}
}
// 创建WEB站点
DirectoryEntry site = (DirectoryEntry)root.Invoke("Create", "IIsWebServer", siteID);
site.Invoke("Put", "ServerComment", webSiteName);
site.Invoke("Put", "KeyType", "IIsWebServer");
site.Invoke("Put", "ServerBindings", domainPort );
site.Invoke("Put", "ServerState", );
site.Invoke("Put", "FrontPageWeb", );
site.Invoke("Put", "DefaultDoc", "Default.html");
// site.Invoke("Put", "SecureBindings", ":443:");
site.Invoke("Put", "ServerAutoStart", );
site.Invoke("Put", "ServerSize", );
site.Invoke("SetInfo");
// 创建应用程序虚拟目录 DirectoryEntry siteVDir = site.Children.Add("Root", "IISWebVirtualDir");
siteVDir.Properties["AppIsolated"][] = ;
siteVDir.Properties["Path"][] = physicalPath;
siteVDir.Properties["AccessFlags"][] = ;
siteVDir.Properties["FrontPageWeb"][] = ;
siteVDir.Properties["AppRoot"][] = "LM/W3SVC/" + siteID + "/Root";
siteVDir.Properties["AppFriendlyName"][] = "Root"; if (isCreateAppPool)
{
DirectoryEntry apppools = new DirectoryEntry("IIS://" + HostName + "/W3SVC/AppPools"); DirectoryEntry newpool = apppools.Children.Add(webSiteName, "IIsApplicationPool");
newpool.Properties["AppPoolIdentityType"][] = ""; //
newpool.Properties["ManagedPipelineMode"][] = ""; //0:集成模式 1:经典模式
newpool.Properties["ManagedRuntimeVersion"][] = "v4.0";
newpool.CommitChanges();
siteVDir.Properties["AppPoolId"][] = webSiteName;
} siteVDir.CommitChanges();
site.CommitChanges();
return siteID;
} /// <summary>
/// 得到网站的物理路径
/// </summary>
/// <param name="rootEntry">网站节点</param>
/// <returns></returns>
public static string GetWebsitePhysicalPath(DirectoryEntry rootEntry)
{
string physicalPath = "";
foreach (DirectoryEntry childEntry in rootEntry.Children)
{
if ((childEntry.SchemaClassName == "IIsWebVirtualDir") && (childEntry.Name.ToLower() == "root"))
{
if (childEntry.Properties["Path"].Value != null)
{
physicalPath = childEntry.Properties["Path"].Value.ToString();
}
else
{
physicalPath = "";
}
}
}
return physicalPath;
} /// <summary>
/// 获取站点名
/// </summary>
public static List<IISInfo> GetServerBindings()
{
List<IISInfo> iisList = new List<IISInfo>();
string entPath = String.Format("IIS://{0}/w3svc", HostName);
DirectoryEntry ent = new DirectoryEntry(entPath); foreach (DirectoryEntry child in ent.Children)
{
if (child.SchemaClassName.Equals("IIsWebServer", StringComparison.OrdinalIgnoreCase))
{
if (child.Properties["ServerBindings"].Value != null)
{
object objectArr = child.Properties["ServerBindings"].Value;
string serverBindingStr = string.Empty;
if (IsArray(objectArr))//如果有多个绑定站点时
{
object[] objectToArr = (object[])objectArr;
serverBindingStr = objectToArr[].ToString();
}
else//只有一个绑定站点
{
serverBindingStr = child.Properties["ServerBindings"].Value.ToString();
}
IISInfo iisInfo = new IISInfo();
iisInfo.DomainPort = serverBindingStr;
iisInfo.AppPool = child.Properties["AppPoolId"].Value.ToString();//应用程序池,有可能不准确
object objComment=child.Properties["ServerComment"].Value;
if (objComment != null)
{
iisInfo.SiteName = objComment.ToString();
}
iisList.Add(iisInfo);
}
}
}
return iisList;
} public static bool CreateAppPool(string appPoolName, string Username, string Password)
{
bool issucess = false;
try
{
//创建一个新程序池
DirectoryEntry newpool;
DirectoryEntry apppools = new DirectoryEntry("IIS://" + HostName + "/W3SVC/AppPools");
newpool = apppools.Children.Add(appPoolName, "IIsApplicationPool"); //设置属性 访问用户名和密码 一般采取默认方式
newpool.Properties["WAMUserName"][] = Username;
newpool.Properties["WAMUserPass"][] = Password;
newpool.Properties["AppPoolIdentityType"][] = "";
newpool.CommitChanges();
issucess = true;
return issucess;
}
catch // (Exception ex)
{
return false;
}
} /// <summary>
/// 建立程序池后关联相应应用程序及虚拟目录
/// </summary>
public static void SetAppToPool(string appname,string poolName)
{
//获取目录
DirectoryEntry getdir = new DirectoryEntry("IIS://localhost/W3SVC");
foreach (DirectoryEntry getentity in getdir.Children)
{
if (getentity.SchemaClassName.Equals("IIsWebServer"))
{
//设置应用程序程序池 先获得应用程序 在设定应用程序程序池
//第一次测试根目录
foreach (DirectoryEntry getchild in getentity.Children)
{
if (getchild.SchemaClassName.Equals("IIsWebVirtualDir"))
{
//找到指定的虚拟目录.
foreach (DirectoryEntry getsite in getchild.Children)
{
if (getsite.Name.Equals(appname))
{
//【测试成功通过】
getsite.Properties["AppPoolId"].Value = poolName;
getsite.CommitChanges();
}
}
}
}
}
}
} /// <summary>
/// 判断object对象是否为数组
/// </summary>
public static bool IsArray(object o)
{
return o is Array;
}
} public class IISInfo
{
public string SiteName { get; set; }
public string DomainPort { get; set; }
public string AppPool { get; set; } }
}
然后,写一个页面来创建网站:
前端HTML:
<form action="/SiteManage/CreateWebSite">
<fieldset>网站名称(不能重复):————<input type="text" name="siteName" class="myInput" /> </fieldset>
<fieldset>网站基准目录(服务器):———<input type="text" name="physicalPath" class="myInput" /></fieldset>
<fieldset>绑定域名(不能重复):————<input type="text" name="domain" class="myInput" /></fieldset>
<fieldset>网站压缩文件路径(服务器):—<input type="text" name="zipFile" class="myInput" value="@ViewBag.ZipFile" /> 如果服务器没有网站压缩文件,请先上传。</fieldset> <input type="submit" name="submit1" value="提交" />
</form>
后端Controller:
public ActionResult CreateWebSite(string siteName, string physicalPath, string domain, string zipFile)
{
bool hasErr = false;
string message = "";
string webSiteFolder = "";
//检查参数,physicalPath 允许不存在,之后解压缩文件的时候将自动创建
if (string.IsNullOrEmpty(siteName) ||
string.IsNullOrEmpty(physicalPath) ||
string.IsNullOrEmpty(domain) ||
string.IsNullOrEmpty(zipFile))
{
hasErr = true;
message = "参数不能为空!";
} //检查是否已经包含了要绑定的域名,如果是,则不允许创建
if (!hasErr)
{
var list = IISControlHelper.IISWorker.GetServerBindings();
foreach (var item in list)
{
if (string.Compare(item.DomainPort, domain, StringComparison.OrdinalIgnoreCase) > )
{
hasErr = true;
message = domain + " 域名已经绑定过,不能创建绑定此域名的新站点。";
break;
}
}
} //检查网站目录并解压缩文件到网站目录
if (!hasErr)
{
try
{
webSiteFolder = CheckWebSiteFolder(physicalPath, zipFile);
if (System.IO.File.Exists(zipFile))
{
UnZipFile(zipFile, physicalPath);
}
else
{
message = zipFile+" 文件不存在!";
hasErr = true;
}
}
catch (Exception ex1)
{
message = ex1.Message;
hasErr = true;
}
} if (!hasErr)
{
try
{ //创建网站
int siteNumber;
siteNumber = IISControlHelper.IISWorker.CreateWebSite(siteName, webSiteFolder, "*:80:" + domain, true);
message = siteNumber > ? "成功" : "失败";
}
catch (System.Runtime.InteropServices.COMException exCom)
{
hasErr = true;
if (exCom.HResult == -)
{
message = "网站名已经存在!";//(应用程序池IIS进程)文件已经存在,上面的方法默认会创建跟网站同名的应用程序池名称
}
else
{
message = exCom.Message;
}
}
catch (Exception ex2)
{
hasErr = true;
message = ex2.Message;
} } ViewBag.SiteName = siteName;
ViewBag.PhysicalPath = webSiteFolder;
ViewBag.Domain = domain;
ViewBag.ResultDesc = message; return View("CreateResult");
}
注意这里会创建一个跟站点名字同名的应用程序池,默认是.NET 4.0,创建后即启动站点。
相关代码下载,点击这里。
4,ASP.NET MVC 上传文件
前端HTML:
<form action="/SiteManage/Upload" method="post" enctype="multipart/form-data">
上传网站压缩文件:<input type="file" name="file1" value="" style="width:300px;" class="myInput" /> <input type="submit" name="submit2" value="上传" />
<span>@ViewBag.Message </span>
</form>
后端Controller:
public ActionResult Upload()
{
string message = "";
HttpPostedFileBase file = Request.Files["file1"];
if (System.IO.Path.GetExtension(file.FileName).ToLower() != ".zip")
{
message = "只能上传ZIP格式的压缩文件。";
return RedirectToAction("Index", new { zipFile = "", message });
}
else
{
string filePath = System.IO.Path.Combine(HttpContext.Server.MapPath("../Uploads"), System.IO.Path.GetFileName(file.FileName));
file.SaveAs(filePath);
message = "上传成功";
return RedirectToAction("Index", new { zipFile= filePath,message});
}
}
注意Request.Files["file1"] 表示获取前端HTML页面的文件双传控件名字 file1 对应的文件。
5,.NET解压缩文件
.NET 4.5之后,集成了文件解压缩功能,下面是使用方法:
/// <summary>
/// 解压缩文件到指定目录,将在指定目录下解压出一个压缩文件名字的最终的目录
/// </summary>
/// <param name="ZipPath">ZIP文件路径</param>
/// <param name="ExtractPath">要解压缩的目录</param>
private void UnZipFile(string ZipPath,string ExtractPath)
{
//string NewFile = @"c:\users\exampleuser\NewFile.txt";
if (System.IO.File.Exists(ZipPath))
{
using (ZipArchive Archive = ZipFile.Open(ZipPath, ZipArchiveMode.Update))
{
//Archive.CreateEntryFromFile(NewFile, "NewEntry.txt");
//如果目录下面有文件,将解压缩失败,所以之前先备份目录
Archive.ExtractToDirectory(ExtractPath);
}
} }
注意这里支持ZIP格式,不是RAR格式,同时需要使用 using System.IO.Compression;相关的程序集。
6,备份文件夹
如果需要备份文件夹,可以使用Move 方法实现,看代码:
/// <summary>
/// 检查站点目录,如果原来的目录已经存在,将自动备份,如果该目录不存在,将自动创建
/// </summary>
/// <param name="physicalPath"></param>
/// <param name="zipFile"></param>
/// <returns></returns>
private string CheckWebSiteFolder(string physicalPath, string zipFile)
{
string webSiteFolder = System.IO.Path.Combine(physicalPath, System.IO.Path.GetFileNameWithoutExtension(zipFile));
if (System.IO.Directory.Exists(webSiteFolder))
{
System.IO.Directory.Move(webSiteFolder, webSiteFolder + "_back" + DateTime.Now.ToString("yyyyMMddHHmmss"));
}
//此目录
return webSiteFolder;
7,给MVC页面传递数据
可以使用ViewBag 方式,例如下面的方式:
public ActionResult Index(string zipFile="",string message="")
{
string iisVersion = IISControlHelper.IISWorker.GetIIsVersion();
ViewBag.IISVerion = iisVersion;
ViewBag.ZipFile = zipFile;
ViewBag.Message = message; return View();
}
ViewBag 是动态类型,在前端页面直接使用它既可。
也可以通过Action传递一个对象给页面,方法如下:
public ActionResult Index(string zipFile="",string message="")
{
var siteList = IISControlHelper.IISWorker.GetServerBindings();
return View(siteList);
}
然后,在 index.cshtml 页面的头部,引入这个Model:
@model List<IISControlHelper.IISInfo>
@{
ViewBag.Title = "ASP.NET在线创建网站Demo";
}
8,SQL语句创建Access数据库表
可以使用SqlServer的基本建表语句,但是有几点不同,首先,不能使用User这样的关键词,然后,在创建自增字段上与SqlServer不同。
Access需要采用下面的方式:
[User ID] autoincrement PRIMARY KEY
不能使用下面的方式:
[User ID] Integer PRIMARY KEY autoincrement
PRIMARY KEY语句必须放在 autoincrement 之后,否则语法错。可见,Access功能的确很简单。
完整的一个建立表语句:
CREATE TABLE [Users](
[User ID] autoincrement PRIMARY KEY
,[First Name] text
,[Last Name] text
,[Age] Integer )
PDF.NET SOD Ver5.3.3.0724 发布,增加了Access Code First 支持,可以生成上面的建表语句。
9,VS复制项目生成的文件到另外一个项目运行目录下
这个问题常见于DLL需要动态加载的情况下,该DLL是在另外一个项目下生成,主体项目运行前需要拷贝到当前运行目录下。
如果DLL的源码经常修改,手工复制比较费事情,采用项目的
生成时间--〉后期生成命令行,输入下面类似的命令:
XCOPY "$(TargetPath)" "$(ProjectDir)..\MainExeProj\bin\$(ConfigurationName)" /Y /D /R
这个命令会将当前项目生成的DLL复制到 跟当前项目文件夹同级的MainExeProj\bin文件夹下面去,$(ConfigurationName) 通常表示 Debug,Release.
10,使用XCopy备份指定日期之后的资料
使用下面的命令:
xcopy C:\SourceDoc D:\CopyedDoc /i /s /y /EXCLUDE:D:\CopyedDoc\excludeFile.txt /d:7-1-2010
这将备份 SourceDoc 目录下面的 7月1日之后所有的文件和文件夹,exclued 文件包含了要排除的文件,比如:
obj
bin
.jpeg
.png
.gif
11,使用jQuery为表格动态添加行
在表格中定义一个模板行,将它作为第一行,然后使用jQuery动态添加行:
<table id="TableID" style="width:100%;background: green;">
<thead>
<th>测试</th>
<th>测试</th>
</thead>
<tbody id="list_data" class="list-data">
<tr id="">
<td><input type="text" value="Test"></td>
<td><input type="text" value="Test"></td>
</tr> </tbody> </table>
HTML
然后使用如下JS代码实现:
<script src="http://cdn.bootcss.com/jquery/1.11.3/jquery.min.js"></script>
<script src="scripts/myplus.js"></script>
<script type="text/javascript">
$(document).ready(function(){
$("#AddRow").click(function(){
AddRow();
});
});
function AddRow(){
var row = $("#list_data tr").eq(0).clone();
row.appendTo("#list_data");
} </script>
关键代码在于 tr节点的克隆。
12,搜索当前目录的子目录或者上级目录下的子目录中特定的目录
首先,搜索当前目录下的子目录,如果没有,逐层搜索上级目录下面的所有子目录,有没有特定的目录。为了防止其它子目录可能跟目标目录重名,还可以同时指定目标目录下特定的一级子目录或者文件。这也是一个“深度优先搜索”的例子。下面是完整的代码:
/// <summary>
/// 搜索特定的目录
/// </summary>
public class SearchSpecFolder
{
/// <summary>
/// 当前搜索总次数
/// </summary>
public int SerachCount { get; private set; } /// <summary>
/// 搜索指定的目录名称,先从当前目录的子目录进行搜索,如果没有搜索到,从当前目录的父目录开始搜索
/// </summary>
/// <param name="baseDir">搜索开始的目录</param>
/// <param name="targetName">目标目录名称</param>
/// <param name="matchChildDir">可选需要继续匹配的目标目录下的子目录</param>
/// <param name="matchChildFile">可需要继续选匹配的目标目录下的文件</param>
/// <returns>如果没有搜索到,返回空字符串</returns>
public string SearchSpectionFolderWithParent(string baseDir, string targetName, string matchChildDir=null, string matchChildFile=null)
{
Console.WriteLine("--Search Parent:{0}", baseDir);
string obj = SearchSpectionChildFolder(baseDir, targetName, matchChildDir, matchChildFile);
if (obj == "")
{
//如果子目录没有搜索到,搜索上级目录
var parentDir = System.IO.Directory.GetParent(baseDir);
if (parentDir == null)
return "";
return SearchSpectionFolderWithParent(parentDir.FullName, targetName, matchChildDir, matchChildFile);
}
return obj;
} /// <summary>
/// 从子目录搜索包含指定目录名称的目录,可以选择用一个子目录或者目录下面的一个文件来匹配当前是正确的目标目录(因为在其它目录下可能有重名的当前目录名称)
/// </summary>
/// <param name="baseFolder">当前目录</param>
/// <param name="targetName">指定的目录名称</param>
/// <param name="matchChildDir">可选需要继续匹配的目标目录下的子目录</param>
/// <param name="matchChildFile">可需要继续选匹配的目标目录下的文件</param>
/// <returns>匹配的目录名称</returns>
private string SearchSpectionChildFolder(string baseFolder, string targetName, string matchChildDir, string matchChildFile)
{
SerachCount++;
if (baseFolder == "")
return "";
//搜索当前子目录
var allDir = System.IO.Directory.GetDirectories(baseFolder);
foreach (var dir in allDir)
{
Console.WriteLine(dir);
if (dir.EndsWith(targetName, StringComparison.OrdinalIgnoreCase))
{
//匹配到目标目录,还需要匹配它的子目录名称或者包含的一个文件名称
if (!string.IsNullOrEmpty(matchChildDir))
{
string objPath = System.IO.Path.Combine(dir, matchChildDir);
if (System.IO.Directory.GetDirectories(dir).Contains(objPath))
return dir;
}
else if (!string.IsNullOrEmpty(matchChildFile))
{
string objPath = System.IO.Path.Combine(dir, matchChildFile);
if (System.IO.Directory.GetFiles(dir).Contains(matchChildFile))
return dir;
}
else
{
return dir;
}
}
//深度优先,搜索子目录
string temp = SearchSpectionChildFolder(dir, targetName, matchChildDir, matchChildFile);
if (temp != "")
return temp;
}
return "";//未找到,返回空
}
}
SearchSpecFolder
13,模拟死锁
在2个查询窗口分别执行执行事务1,2,将导致死锁:
--事务模拟测试2
begin tran UPDATE Table1 set END_TIME=GETDATE() where id=N'f998b30a5d384f7ebfeb4646fbed6c88';
WaitFor Delay '00:0:20'; update Table2 set END_TIME=GETDATE() where ID='94b9f18f953f4a3b837153969c6bfc1d';
WaitFor Delay '00:0:10';
Rollback tran --事务模拟测试2
begin tran update Table2 set END_TIME=GETDATE() where ID='94b9f18f953f4a3b837153969c6bfc1d'; WaitFor Delay '00:00:20';
UPDATE Table1 set END_TIME=GETDATE() where id=N'f998b30a5d384f7ebfeb4646fbed6c88';
WaitFor Delay '00:00:20';
Rollback tran
执行后,会出现下面类似的死锁信息:
消息 1205,级别 13,状态 51,第 2 行
事务(进程 ID 89)与另一个进程被死锁在 锁 资源上,并且已被选作死锁牺牲品。请重新运行该事务。
注意:必须在测试代码上,rollback tran 前,也增加
WaitFor Delay '00:00:20';
否则,SQLSERVER 2008 不会出现死锁,好多例子都没有这一句,是无法模拟死锁的。
除了使用Update语句,Insert语句在事务中,更容易出现死锁,比如如下的例子:
SQL1:
use DBDemo
begin tran
insert into [BookMarks]([BookMarkName]
,[BookMarkDesc]
,[BookMarkText]) values('人民日报合集2014','人民日报合集2015','人民日报合集2015')
waitfor delay '00:00:10'
select * from [BookMarks] where [BookMarkName] = '人民日报合集2014'
commit tran
SQL2:
use DBDemo
begin tran
insert into [BookMarks]([BookMarkName]
,[BookMarkDesc]
,[BookMarkText]) values('人民日报合集2015','人民日报合集2015','人民日报合集2015')
waitfor delay '00:00:10'
select * from [BookMarks] where [BookMarkName] = '人民日报合集2015'
commit tran
同时执行这2个查询,发现执行时间超过了语句中需要延迟的10秒,然后,其中一个查询出现了死锁:
( 行受影响)
消息 ,级别 ,状态 ,第 行
事务(进程 ID )与另一个进程被死锁在 锁 资源上,并且已被选作死锁牺牲品。请重新运行该事务。
这说明,在事务情况下,Insert语句将会使用表锁,而不是行锁,从而增大了死锁的几率。
14,Word内置的mso图标
在进行VSTO编程的时候,会有一个 ribbon.xml配置文件,用于配置自定义的功能区按钮,这些按钮的图片可以是Word内置的,如下配置:
<button id="PreviewPDF" label="预览报告" size="large" imageMso="FilePrintPreview" onAction="OnButtonClicked" screentip="预览报告" supertip="预览报告" />
那么去哪里找这些 mso图片呢?下面这个网站,可以在线浏览这些图片并获取关联的名称:
http://www.soltechs.net/CustomUI/imageMso01.asp?gal=3&count=no
15,在线操作Excel
在服务器安装Excel来操作不是一个好主意,需要复杂的COM+权限配置,并且还可能出现进程冲突,所以大家都常用第三方的Excel操作库,除了NPOI,还可以使用
16,文档开发
17,对象序列化找不到构造函数的问题
[Serializable]
public class NameValueItem : NameValueCollection
{
/// <summary>
/// 为二进制序列化提供默认构造函数
/// </summary>
public NameValueItem() { }
protected NameValueItem(SerializationInfo info, StreamingContext context) : base(info, context) { }
public List<NameValueItem> Children { get; set; }
}
18,创建数据库订阅,出现 错误22022 SQLServerAgent 的问题解决
19,SqlServer发布-订阅行数据过大无法复制的问题
选择“服务器属性”-》高级-》最大文本复制大小,默认是 65536(64K),修改成需要的数量即可。
20,Windows Server 2012 加入域(AD)后,IIS 网站访问没有权限的问题
之前,需要把网站的目录授权给 IIS_IUSRS 用户组,但是服务器加入域之后,该用户组变成了 "服务器名\IIS_USRS" ,访问网站的时候提示说没有权限访问网站的文件目录。
此时,除了IIS_IUSRS 用户之外,还需要把 IUSR 用户授权给网站目录,原因是下面的说法:
IIS 7的内置用户(组)突破了SID的限制,因为IIS7在调用这些内置用户(组)时,使用的是用户名而非SID。而且在不同语言版本的系统中,IIS 7的内置用户(组)都是IUSR(IIS_IUSRS)。其中,IUSR用于取代IUSR_MachineName,IIS_IUSRS用于取代IIS_WPG。
21,浏览器执行本机应用程序
可以使用wscript.shell 执行,注意只有IE支持,并需要IE设置安全级别,HTML代码如下:
<html>
<head>
<title>IE调用本地程序测试</title>
</head>
<bodey>
<h2>IE调用本地程序测试</h2>
<br>请在IE下运行此程序
<script>
function openFile(filename){
try{
var obj= new ActiveXObject("wscript.shell");
if(obj){
obj.Run("\""+filename+"\"",1,false);
obj=null;
}
}catch(e){
alert(e);
}
} openFile("notepad");
</script>
</body>
</html>
22,查询表所有的键
SqlServer可以通过下面的语句查询实现:
select * from sysobjects where parent_obj in (select id from sysobjects where name='Tb_Customer')
结果列 xtype包含 下列信息:
UQ:唯一键
PK:主键
F:外键
(本节完)
常见.NET功能代码汇总的更多相关文章
- 常见.NET功能代码汇总 (2)
常见.NET功能代码汇总 23,获取和设置分级缓存 获取缓存:首先从本地缓存获取,如果没有,再去读取分布式缓存写缓存:同时写本地缓存和分布式缓存 private static T GetGradeCa ...
- 常见.NET功能代码汇总 (3)
33,彻底关闭Excel进程 .NET中使用Excel属于使用非托管资源,使用完成后一般都要用GC回收资源,但是,调用GC的位置不正确,Excel进程可能无法彻底关闭,如下面的代码: static v ...
- java开发功能代码汇总
多文件上传 http://smotive.iteye.com/blog/1903606 java 常用代码 Struts2 前后台(Action ,jsp)传值.取值 Action public Li ...
- js 技巧 (六)弹窗代码汇总
弹窗代码汇总 [0.超完美弹窗代码] 功能:5小时弹一次+背后弹出+自动适应不同分辩率+准全屏显示 代码: <script> function openwin(){ window.open ...
- leetcode常见算法与数据结构汇总
leetcode刷题之后,很多问题老是记忆不深刻,因此特意开此帖: 一.对做过题目的总结: 二.对一些方法精妙未能领会透彻的代码汇总,进行时常学习: 三.总结面试笔试常见题目,并讨论最优解法及各种解法 ...
- 原生JS实现购物车结算功能代码+zepto版
html <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3 ...
- Magento Table Rate运费国家代码汇总
Magento Table Rate是三种内置未调用第三方API运费方式中最强大的一个.通过设置国家,区域,邮编,价格来划分不同的运费等级.该方式基本能够满足轻量级的B2C商城的运费模式.这里收集下国 ...
- 通过javascript库JQuery实现页面跳转功能代码
通过javascript库JQuery实现页面跳转功能代码的四段代码实例如下. 实例1: 1 2 3 4 $(function(){ var pn = $("#gotopagenum&quo ...
- 矩阵分解(rank decomposition)文章代码汇总
矩阵分解(rank decomposition)文章代码汇总 矩阵分解(rank decomposition) 本文收集了现有矩阵分解的几乎所有算法和应用,原文链接:https://sites.goo ...
随机推荐
- 安装和使用的django的debug_toolbar
安装和使用的django的debug_toolbar Django Debug Toolbar安装 安装Django Debug Toolbar pip install django-debug-to ...
- Web端即时通讯技术盘点:短轮询、Comet、Websocket、SSE
1. 前言 Web端即时通讯技术因受限于浏览器的设计限制,一直以来实现起来并不容易,主流的Web端即时通讯方案大致有4种:传统Ajax短轮询.Comet技术.WebSocket技术.SSE(Serve ...
- OOM异常产生的原因和处理方法
一般而言,android中常见的原因主要有以下几个: 1.数据库的cursor没有关闭. 2.构造adapter没有使用缓存contentview. 3.调用registerReceiver()后未调 ...
- LLBL Gen + Entity Framework 程序设计入门
Entity Framework推出有好几年,除了微软的Visual Studio可以做实体框架开发外,第三方的开发工具如LLBL Gen, Devart Entity Developer也可以用来做 ...
- js中关于value的一个小知识点(value既是属性也是变量)
今天在学习input的value值时,发现这么一个小知识点,以前理解不太透彻. [1]以下这种情况是常见情况,会弹出“测试内容” <input type="button" v ...
- Java多线程系列--“基础篇”06之 线程让步
概要 本章,会对Thread中的线程让步方法yield()进行介绍.涉及到的内容包括:1. yield()介绍2. yield()示例3. yield() 与 wait()的比较 转载请注明出处:ht ...
- HTML5移动Web开发(一)——HTML5和移动网站基本概念以及一些模拟器
当前,手机设备发展迅猛.屏幕尺寸各不相同.存储和性能仍有局限性,如何结合HTML5的功能,在多平台上创建高性能.响应式的移动网站,是Web开发者所要面对的首要挑战.HTML5以及移动网站都是很有前景的 ...
- nodemailer实现node发送邮件
作为一个前端er,利用node独立做一些全栈小项目,是很有效率和必要的. 需要: 做一个活动报名页面,用户填好的表单需要被工作人员收到,一想到把数据存数据库,还需要给工作人员写一个管理页面就觉得很麻烦 ...
- Responsive Web CSS – 在线响应式布局创建器
如果您已经使用了 CSS 或前端框架,创建响应式布局应该不难. 然而,如果你刚涉足这类布局,Responsive Web CSS 可以帮助你快速上手. 这是一个基于 Web 的工具,使任何人都可以通过 ...
- 老鸟谈谈JAVA EE的学习
老鸟谈谈JAVA EE的学习 因为出差和项目的原因,有将近一个月的时间没有更新博客了,今天终于得闲,和兄弟们分享一下JAVA EE的学习心得.书中带过,直入主题,下面我们首先看看什么是JAVA EE. ...