我可能会负责将vb6应用程序移植到c#.此应用程序是一个与访问数据库交互的Windows应用程序.数据访问封装在基本业务对象中.基本上一个表的一个类.现有的vb6业务对象通过DAO读写DB.我以前写了几次DAL和ORM,但它们都只针对SQL Server.这个将需要目标访问和SQL服务器.在以前的项目中,我会将SQL字符串放在业务对象的私有部分中,并可能将冗余的sql代码(如连接,创建命令)移动到公共基类中以减少代码.
这一次,我正在考虑将SQL字符串写入.settings文件或其他键/值类型文本文件.然后我会编写一个sql实用程序来编辑这个文件,并允许我运行并测试参数化查询.这些查询将在业务对象中按名称引用,而不是将sql嵌入到代码中.
我知道一种标准方法是为每个目标数据库创建一个DAL,并具有要使用的DAL配置状态.我真的不想为每个数据库创建两个DAL类.如果我只是通过keyname引用了正确的查询并且具有正确的连接类型,那么似乎代码会更少.
那么,你们这样做吗?你怎么会或者你有没有解决这个问题?什么最适合你?
谢谢!
早上好,
我有一个从List下载并拥有公共属性的集合.Xml序列化程序没有提升我的能力.列表项序列化很好.我尝试过XmlAttribute属性无济于事.你们有解决方案吗?
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void button1_Click(object sender, RoutedEventArgs e)
{
var people = new PersonCollection
{
new Person { FirstName="Sue", Age=17 },
new Person { FirstName="Joe", Age=21 }
};
people.FavoritePerson = "Sue";
var x = new XmlSerializer(people.GetType());
var b = new StringBuilder();
var w = XmlTextWriter.Create(b, new XmlWriterSettings { NewLineChars = "\r\n", Indent = true });
x.Serialize(w, people);
var s = b.ToString();
}
}
[XmlRoot(ElementName="People")]
public class PersonCollection : …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用XmlSerializer来持久化List(T),其中T是一个接口.序列化器不喜欢接口.我很好奇是否有一种简单的方法可以使用XmlSerializer轻松地序列化异构对象列表.这就是我想要的:
public interface IAnimal
{
int Age();
}
public class Dog : IAnimal
{
public int Age()
{
return 1;
}
}
public class Cat : IAnimal
{
public int Age()
{
return 1;
}
}
private void button1_Click(object sender, RoutedEventArgs e)
{
var animals = new List<IAnimal>
{
new Dog(),
new Cat()
};
var x = new XmlSerializer(animals.GetType());
var b = new StringBuilder();
var w = XmlTextWriter.Create(b, new XmlWriterSettings { NewLineChars = "\r\n", Indent = true });
//FAIL - …Run Code Online (Sandbox Code Playgroud) 我正在尝试DataTrigger为Image元素定义一个元素,以便它显示连接/断开连接的图像.我不断收到Invalid PropertyDescriptor消息.有任何想法吗?
<Image>
<Image.Style>
<Style>
<Style.Triggers>
<DataTrigger Binding="{Binding Source={x:Static my:Server.Instance}, Path=Connected, Mode=OneWay}"
Value="True">
<Setter Property="Source"
Value="serverconnected.png"/>
</DataTrigger>
</Style.Triggers>
</Style>
</Image.Style>
</Image>
Run Code Online (Sandbox Code Playgroud) 问题1:
我有一个简单的winforms应用程序,我希望DataBind我的Person.Name属性到一个文本框.名称的类型为StringField.我最初将Name属性定义为String.数据绑定在值类型(如String)上非常有用.我希望StringField.Value属性是StringField的默认属性.我想在textBox中看到StringField.Value的值而不是文本"FieldApp.StringField".
问题2:
我希望能够使用operator =将字符串分配给StringField.此赋值将导致设置StringField.Value成员.
这可以实现吗?
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace FieldApp
{
public class StringField
{
public string Value { get; set; }
}
public class Person
{
//private String _Name;
//public String Name
//{
// get { return _Name; }
// set { _Name = value; }
//}
//public Person(string name)
//{
// Name = name;
//}
private StringField _Name;
public StringField Name
{
get { …Run Code Online (Sandbox Code Playgroud) 我只是想分享这个Query类,并对它有所了解.Query类有助于对dbconnection执行查询.我没有包含实现,发布有点多.这是一个示例调用,你会明白这个想法:
OrdersDataTable table =
new Query(connection)
.Table("Orders")
.Fields("OrderID,CustomerID,Description,Amount")
.GreaterThan("OrderID", 1000)
.OrderBy("OrderID")
.Execute<OrdersDataTable>();
Run Code Online (Sandbox Code Playgroud)
以下是我喜欢上课的原因:
我有一个内部使用此类的DAL.UI将调用DAL,传递一些查询参数并返回DataTable.该类确实帮助减少了LOC的DAL实现,并使其更具可读性.
这是一个DAL调用示例:
OrdersDataTable orders = Orders.GetByOrderId( 1 )
Run Code Online (Sandbox Code Playgroud)
并且impl:
public static OrdersDataTable GetByOrderId( int id )
{
return
new Query(connection)
.Table("Orders")
.Fields("OrderID,CustomerID,Description,Amount")
.Equals("OrderID", id)
.Execute<OrdersDataTable>();
}
Run Code Online (Sandbox Code Playgroud)
谢谢!
编辑:感谢大家的好评.很多人都建议使用LinqToSql.我没有选择Linq,因为Microsoft目前只支持Sql Server.我需要查询Jet,MySql和Sql Server表.
有人询问如何构造AND和OR子句.这是每个例子
//and example
public static OrdersDataTable GetByOrderIdAndCustomerId( int orderId, int customerId )
{
return
new Query(connection)
.Table("Orders")
.Fields("OrderID,CustomerID,Description,Amount")
.Equals("OrderID", orderId)
.Equals("CustomerID", customerId)
.Execute<OrdersDataTable>();
}
//or example
public static OrdersDataTable GetByOrderIdOrCustomerId( int …Run Code Online (Sandbox Code Playgroud) 我一直认为DataTable会消耗比通用List更多的内存.我正在测试加载DataTable并从SQL Server查询加载List.在这种情况下,DataTable消耗的内存较少.我得到了前2000行,每行有134个字段.一个二进制字段,其余为标准varchar,int,bit等.
在这个世界上,如果DataTable的所有开销都比List少,那么它的内存消耗量是多少?GC使用DataTable报告大约4mb,使用列表报告5mb.
我测试了一些NorthWind表,在这些情况下列表略小.
private void GetMemory()
{
label1.Text = string.Format("{0:0.00} MB", GC.GetTotalMemory(true) / 1024.0 / 1024.0);
}
private void DataTableButton_Click(object sender, EventArgs e)
{
var conn = new SqlConnection(@"Initial Catalog=ADatabase;Data Source=AServer;Integrated Security=True");
conn.Open();
var cmd = new SqlCommand("SELECT TOP 2000 * FROM AManyColumnedTable", conn);
var r = cmd.ExecuteReader();
_rows = new List<object[]>();
//uses more memory
object[] a = null;
while (r.Read())
{
a = new object[r.FieldCount];
r.GetValues(a);
_rows.Add(a);
}
//uses less memory
//_table = new DataTable("TheTable");
//_table.Load(r);
r.Close();
conn.Close(); …Run Code Online (Sandbox Code Playgroud) 我正在将记录从一个sql server db插入另一个.我需要获取新插入的id并更新源表上的字段.我可以通过INSERTED选项获取新ID没问题.但是,我似乎无法从源表中获取ID.目标表没有源ID的字段.源表是转换表,我不想用转换字段污染目标表.这可能是不可能的,但我想我先和你们一起检查一下.
drop table #Table1
CREATE TABLE #Table1
(
Table1ID INT,
Table2ID INT,
NAME VARCHAR(32)
)
INSERT INTO #Table1
VALUES
(1, NULL, 'Fred')
,(2, NULL, 'Tom')
,(3, NULL, 'Sally')
--ok, im inserting into #Table2
drop table #Table2
CREATE TABLE #Table2
(
[Table2ID] [int] IDENTITY(1,1) NOT NULL,
NAME VARCHAR(32)
)
--THE RUB, I want to insert Table2ID into table3
--along with Table1ID. I cannot seem to reference table1
--Any Ideas?
insert into #Table2(NAME)
OUTPUT INSERTED.Table2ID, T.Table1ID into #Table3
select Name …Run Code Online (Sandbox Code Playgroud) 我无法使用类似的语句来处理空格和尾随通配符.我的查询如下:
select * from Table where Field like 'Desc_%'
数据以空格分隔,例如Desc Top,Desc Bottom等.当我使用模式'Desc_%'时查询有效,但当我使用模式'Desc%'时查询无效.该字段为nvarchar(255).
有任何想法吗?
编辑
事实证明数据是制表符分隔的,当我从2008 Management Studio复制一个值时,它将选项卡转换为空格.愚蠢的错误.我确实喜欢[]提示,所以我给它标记了答案.谢谢大家,我会记得不相信网格结果中的副本.
我有一些实现通用非通用接口的通用类。我创建通用对象并将它们添加到列表中。我如何使用 LINQ 或任何其他方法来按泛型类型过滤列表。我不需要在运行时知道 T 。我向接口添加了一个类型属性,并使用 LINQ 通过它进行过滤,但我希望使用 is 运算符。这是我整理的一个简单的例子。
有任何想法吗?
interface IOperation
{
object GetValue();
}
class Add<T> : IOperation
{
public object GetValue()
{
return 0.0;
}
}
class Multiply<T> : IOperation
{
public object GetValue()
{
return 0.0;
}
}
private void Form1_Load(object sender, EventArgs e)
{
//create some generics referenced by interface
var operations = new List<IOperation>
{
new Add<int>(),
new Add<double>(),
new Multiply<int>()
};
//how do I use LINQ to find all intances off Add<T>
//without …Run Code Online (Sandbox Code Playgroud) 我正在写一个返回DataTable和IEnumerable的类.除了返回类型之外,我无法完全定义接口方法.所以,我希望我可以创建这个接口(显然,它不会编译):
interface IMyInterface
{
DataTable GetResults();
IEnumerable<string> GetResults();
}
Run Code Online (Sandbox Code Playgroud)
那么,你将如何构造这两个函数,重命名它们,多个接口,参数?
我只是好奇你们将如何处理它,ty ...