|
Hi, i'm just about to start quite a large project that i'd like to use the Enterprise Library blocks for. I can see massive benefits of using the library but have come across a huge problem, for me at least.
I use DataRows / DataTables to pass to and from my Dal, all the Business objects have a ToDataRow, FromDataRow that maps DataRow columns to Business attributes. This allows me to contruct classes from Datatables (Collections) or from a single DataRow. I did things this way specifically because using the old Data Access application block I could get a list of SqlParameters (SqlHelperParameterCache.GetSpParameterSet) from a stored procedure then map these to the DataRow columns using sproc param name and column name and not have to worry about providing specific mappings for every stored procedure, and I could just write a BaseClass that did most of the functionality for me, all the DalcClasses did was specify a sproc name, and pass on the DataRow produced from the Business object, e.g.
User Business Class
DalcUser.Update(this.ToDataRow());
User DALC:
public static void Update(DataRow drUser)
{
BaseUpdate("UpdateUser", drUser);
}
I don't see anyway of doing this in the Enterprise Library anyone any ideas. Should I just change to using DataSets I just find them overkill considering most of the time all you want is a DataRow, even then i don't think this is solved.
Many Thanks
Tim
|
|
|
|
|
Using AOP you can save and load data without using any of that
You can use reflection to automatically populate a class based on the fields from a reader
I'm not an expert yet, but I play one at work. Yeah and here too.
|
|
|
|
|
How can I check if a int is NaN?
|
|
|
|
|
|
my application does some math calculations, but sometimes the result is NaN as caused by sqrt(-2) for example, I would not want to display such results
|
|
|
|
|
An int can't be NaN. NaN is only available in the floating point numeric formats (float.IsNaN(myNumber) ).
You are probably looking for nullable types which are newly available in .Net 2.0.
|
|
|
|
|
float.IsNaN(myNumber) seems to be useful, thanks!
|
|
|
|
|
if you uses an object with a variable int, and that object is populate in an api, and not pass a value to variable int, then the value can by null, that way you can obtain a value not int
|
|
|
|
|
Hi.
How can I determine when a length-prefixed string is prefixed with a byte (1 byte) or word (2 bytes) value?
Furthermore in what format is the length-value? (fyi: it's not just the length)
I stumbled upon this question when describing the format of a file. I've tested around a lot but didn't get the clue of what format the length-prefix is.
Thanks for advice.
|
|
|
|
|
Is this a file or structure?
.NET doesn't have fixed length strings
Nick
I'm not an expert yet, but I play one at work. Yeah and here too.
|
|
|
|
|
You could use the underlying stream's position property to find the length.
Normally you would just use BinaryReader.ReadString to read the value, I don't know why you need the exact format. I suppose that the value of the first byte determines how many bytes are used for the length - a first byte of 0 to 127 means just one byte, 128 to x means 2 bytes etc... just a guess.
MSDN does not seem to explain this, so the easiest way would be to look at the implementation (use Reflector or look at the Rotor or Mono code)...
OK, I've looked at it myself, here's the code (Rotor):
389: protected void Write7BitEncodedInt(int value) {
390: // Write out an int 7 bits at a time. The high bit of the byte,
391: // when on, tells reader to continue reading more bytes.
392: uint v = (uint) value; // support negative numbers
393: while (value >= 0x80) {
394: Write((byte) (value | 0x80));
395: value >>= 7;
396: }
397: Write((byte)value);
398: }
|
|
|
|
|
For .NET users, they can simply use BinaryReader.ReadString(), that's correct. But I wanted to describe the file format for non-.NET users. I don't think they know a thing about it if I say "it's .NET prefixed". I haven't found any information on MSDN, too.
If I just write a 127 characters string, the hex code looks like:
7F 78 78 78 78... (where 78 is 'x'), 7F = 127
For 128 characters it's: 80 01 78 78 78 78... 80 = 128, 01 = ?.
For 256 characers it's: 80 02 78 78 78 78...
For 300 characters it's: AC 02 78 78 78 78...
For 512 characters it's: 80 04 78 78 78 78...
For 32768 characters it's: 80 80 02 78 78 78...
Now ok.. the 127 (and below) version looks quite simple.. but compared to the 128+ version, how can one determine if the second byte does not belong to the string but to the length prefix? I don't get the clue of this length prefixing thing
-- modified at 12:34 Wednesday 14th December, 2005
[quote]393: while (value >= 0x80) {
394: Write((byte) (value | 0x80));
395: value >>= 7;
396: }[/quote]
Hm so.. this means, while the byte value is >= 0x80 (128) there is a following byte, as long at it's value is < 0x80. But what about the 300 characters prefix? AC 02? AC is just 172 in decimal but the string length is 300.
-- modified at 12:38 Wednesday 14th December, 2005
Ah hell... wait... this prefix thing is very confusing. So.. AC means 0x80 + 0xAC = 300. Why needs that damn technique to be so complicated?
It makes it even more difficult to describe the length prefix
|
|
|
|
|
The comment in the rotor code is quite clear:
// Write out an int 7 bits at a time. The high bit of the byte,
// when on, tells reader to continue reading more bytes.
A length prefix consists of zero or more bytes in the 128-255 range and one byte in the 0-127 range.
The binary number zzyy.yyyy.yxxx.xxxx is encoded as 1xxxxxxx 1yyyyyyy 000000zz
The rotor code for reading:
474: protected int Read7BitEncodedInt() {
475: // Read out an int 7 bits at a time. The high bit
476: // of the byte when on means to continue reading more bytes.
477: int count = 0;
478: int shift = 0;
479: byte b;
480: do {
481: b = ReadByte();
482: count |= (b & 0x7F) << shift;
483: shift += 7;
484: } while ((b & 0x80) != 0);
485: return count;
486: }
|
|
|
|
|
If you visit ‘Add Counter’ window in (WinXP) perfmon and select the ‘Memory’ performance object, you see several counters in the list below. Available bytes, Cache bytes and so on.
But for some reason my machine (WinXP) shows only one counter in this section. It happens to be ‘Available Mbytes’, only one entry. I have no idea where the others have gone.
I need to restore the default counters for ‘Memory’ performance object because I am working on a project which reads values of some of the counters I mentioned above. The code always fails on machine throwing an exception ‘instance name xxx is not valid for this counter category’
Can somebody help regarding what I can do to restore default performance counters?
Salil Khedkar [^]
|
|
|
|
|
Assuming you're missing counters specific to .NET, does running lodctr %WINDIR%\Microsoft.NET\Framework\v1.0.3705\CORPerfMonSymbols.ini at the command prompt help?
Regards
Senthil
_____________________________
My Blog | My Articles | WinMacro
|
|
|
|
|
No these were Windows performance counters (not specific to .NET) The CORPerfMonSymbols are all there.
Anyways, thanks man.
Salil Khedkar [^]
|
|
|
|
|
Hi,
I am developing the Date Access Tier. Can soem one help me with a stand alone SqlDataReader. I have created a connection class and would like to then open the connection in the Data Access class, but I am stuck. Every piece of material that I read, just implements code in the same class. I Know that i can drag and drop the connection and all but i don't want to do that. I am new to coding.
<code>
public class Connectivity
{
private string ServerName = "";
//private string prvWINNTAuth = "";
//private string sDBInfo = "";
//private string sStaticDataConnectionString = "";
private string DatabaseName = "";
public Connectivity()
{
DatabaseName = "(Local)";
ServerName = "DataBase";
}
public SqlConnection SetConnection()
{
return GetConnection();
}
private string UserName
{
get{return prvUserName;}
set{prvUserName = value;}
}
private string Password
{
get{return prvPassword;}
set{prvPassword = value;}
}
private string DatabaseName
{
get{return prvDatabaseName;}
set{prvDatabaseName = value;}
}
private string ServerName
{
get{return sServerName;}
set{sServerName = value;}
}
<code>
private int WinNTAuth
{
get{return bUseWinSecurity;}
set{bUseWinSecurity = value;}
}
private int UserAccessLevel
{
get{return iAccessLevel;}
set{iAccessLevel = value;}
}
private string ConnectionString()
{
string connStr = "";
string sMsg = "";
try
{
connStr = "server=" + ServerName + ";" +
"integrated security=SSPI;" +
"database=" + DatabaseName;
}
catch (Exception ex)
{
connStr = "";
sMsg = "DataAccess: ConnectionString: " + ex.Message.ToString();
throw new Exception(sMsg);
}
try
{
if (WinNTAuth == Convert.ToInt16(vbWINNTAuth.vbUseApplication))
{
connStr = connStr + "user id=" + UserName + ";";
connStr = connStr + "PWD=" + Password + ";";
}
else
{
connStr = connStr + "persist security info=True;";
connStr = connStr + "integrated security=sspi;";
}
}
catch (Exception ex)
{
connStr = "";
sMsg = "DataAccess: ConnectionString: " + ex.Message.ToString();
throw new Exception(sMsg);
}
return connStr;
}</code>
private SqlConnection GetConnection()
{
<code>string sMsg = "";
SqlConnection conn = new SqlConnection(ConnectionString());
try</code>
{
conn.Open();
return conn;
}
catch (Exception ex)
{
conn.Close();
if(conn != null)
{
conn = null;
}
sMsg = "DataAccess: GetConnection: " + ex.Message.ToString();
throw new Exception(sMsg);
}
}
public void CloseConnection(SqlConnection conn)
{
string sMsg = "";
try
{
if (conn.State != ConnectionState.Open)
{
conn.Close();
if(conn != null)
{
conn = null;
}
}
}
catch (Exception ex)
{
sMsg = "DataAccess: Login: " + ex.Message.ToString();
throw new Exception(sMsg);
}
}
public bool Login()
{
string sMsg = "";
bool ret = true;
SqlConnection cn = new SqlConnection(ConnectionString());
try
{
cn.Open();
if (cn.State != ConnectionState.Closed)
{
ret = true;
cn.Close();
}
else
{
ret = Convert.ToBoolean(ConnectionState.Closed);
}
}
catch (Exception ex)
{
if (cn.State != ConnectionState.Closed)
{
cn.Close();
if(cn != null)
{
cn = null;
}
}
sMsg = "DataAccess: Login: " + ex.Message.ToString();
throw new Exception(sMsg);
}
return ret;
}
<code></code><code></code></code></code>
|
|
|
|
|
just do a command object and return if
SqlCommand cmd = new SqlCommand( "<stroed procedure name>", conn);
cmd.CommandType = CommandType.StoredProcedure;
return cmd.ExecuteDataReader();
while to read:
while( myReader.Read() )
{}
I'm not an expert yet, but I play one at work. Yeah and here too.
|
|
|
|
|
Thanks Ista.
|
|
|
|
|
You can use Relection to populate the class also
Get the name of the field. Get the Name of the Property into a PropertyInfo object then call set value.
Then you wont have and hunky stored proc code for getting and saving.
Use CommandBuilder.DeriveParameters to get all the parameters dynamically
use the reader to step through
I'm not an expert yet, but I play one at work. Yeah and here too.
|
|
|
|
|
Ista wrote: You can use Relection to populate the class also
Get the name of the field. Get the Name of the Property into a PropertyInfo object then call set value.
Then you wont have and hunky stored proc code for getting and saving.
Use CommandBuilder.DeriveParameters to get all the parameters dynamically
use the reader to step through
I will try it tonight as I am still working on my project and will start in about five minutes. I will let you know if i have any other questions. thanks for the all your help
|
|
|
|
|
Hello
I am trying to use principal permission in my code, using the imperative security permission, as follow.
appAdmin.CurrentDomain.SetPrincipalPermissionPolicy(PrincipalPolicy.WindowsPrincipal);
void doMe()
{
PrincipalPermission iPerm = new PrincipalPermission(null,"RoleName");
iPerm.Demand();
}
And then I created a new role ("RoleName") and assign it to my user, using the azman console.
But when I am trying to run this code, I get the exception: "request for principal permission failed".
|
|
|
|
|
how to configure log4net for class library project
|
|
|
|
|
|
Thanks for the reply. But the solution given in the website is for Winform or console but the same code didnt work for class library do you have anything for the class library.
|
|
|
|