Thursday, June 30, 2011

How to prevent duplicates in 2 columns in one table

We know how to define column as unique, but what to do where you need to prevent duplicate in 2 columns?
This is a state:
CREATE TABLE #tmp
(
Id INT,
Wine VARCHAR(50),
Country VARCHAR(50)
)

INSERT INTO #tmp VALUES
(1,'Merlot','France')
INSERT INTO #tmp VALUES
(2,'Merlot','Argentina')
INSERT INTO #tmp VALUES
(3,'Malbec','Argentina')

SELECT * FROM #tmp
DROP TABLE #tmp

A result is:


Id |  Wine    |  Country
----------- ------------------
1 | Merlot | France
2 | Merlot | Argentina
3 | Malbec | Argentina


A target to prevent:



Id |  Wine    |  Country
----------- ------------------

1 | Merlot | France
2 | Merlot | Argentina
3 | Malbec | Argentina

4 | Merlot | France
5 | Caberne | France



That means table allow duplicate Wines and duplicate Countries, but must prevent double rows.
A solution is to add next row after table creation:
ALTER TABLE  #tmp      ADD UNIQUE(Wine, Country)



Enjoy


Monday, June 27, 2011

Generic Type Convert Function

It's simple method can be use as extension method for conversion types :
public static TK ConvertTo<TK>(this object value,bool isThrowException = false, 
TK defaultValue = default(TK))
{
try
{
return (TK)Convert.ChangeType(value, typeof(TK));
}
catch (InvalidCastException ex)
{
if (isThrowException)
{
throw ex;
}
return defaultValue;
}



Using example:

string value = "15";
//Method will convert string to int.
//In case val is not numeric will throw exception.
int result = value.ConvertTo();
//In case val is not numeric will return type default value.
int result1 = value.ConvertTo(false);
//In case val is not numeric will return your defined value (5).
int result2 = value.ConvertTo(false,5);

Enjoy!

kick it on DotNetKicks.com

Wednesday, June 22, 2011

Entity Framework, web.config and error "The specified named connection is either not found in the configuration..."

Hi my friend,

If  you come to here from generic search, then you already know what is a real nightmare. Every new feature from Microsoft can include surprised items and will take hours (sometimes days) for understand how it work correct. Anyway...

For using Entity Framework as DLL class-library in win/console application you should work by next steps:

1. Create YOUR_NAME.edmx.
2. Open designer.
3. Click on background.
4. In property tab change property "Metadata artifact Processing" to "Copy to Output Directory".
5. Save project (Connection string will be changed from "res//*/" to ".\" ).
6. Copy connection string to main app.config as is.
7. Go to EF project properties. Choose "Build event" and in Post-Build event command line add next rows:

copy  YOUR_NAME.csdl $(SolutionDir)START_PROJECT\bin\Debug\
copy  YOUR_NAME.ssdl $(SolutionDir)START_PROJECT\bin\Debug\
copy  YOUR_NAME.msl $(SolutionDir)START_PROJECT\bin\Debug\

8. Remove app.config of EF project.

But the nightmare does not live in win application, because she's place in Web Application!

Next steps will help you to back out from hell:
Do it 1-6 steps as in win application case.
7. In web.config change  ".\" to "~\App_Data" in c/m/s files
8. Go to EF project properties. Choose "Build event" and in Post-Build event command line add next rows:

copy  YOUR_NAME.csdl $(SolutionDir)START_WEB_PROJECT\App_Data\
copy  YOUR_NAME.ssdl $(SolutionDir)START_WEB_PROJECT\App_Data\
copy  YOUR_NAME.msl $(SolutionDir)START_WEB_PROJECT\App_Data\

9. Remove app.config of EF project.
10. Cross fingers, run it and pray!

Enjoy!

Sunday, June 05, 2011

Full solution to: The server committed a protocol violation. Section=ResponseStatusLine

In most answers to this error you will get same answer:
<system.net>
    <settings>      
      <httpWebRequest useUnsafeHeaderParsing="true" />
    </settings>
</system.net>

But not always a problem will be resolved. A full solutions to error present here. Just add next row to request variable:

   request.KeepAlive = false;

OR

   ((HttpWebRequest)request).KeepAlive = false; (Where request type is WebRequest)

LINQ2SQL Connection Strings with class library projects

1. Set connection string in Web/App.config in main external project.
2. Open up your DBML and click the designer service. Expand the Connection property, delete Connection String and set "Application Settings" to False.
3. Open designer file and add new construtor as:
  public DataClassesDataContext()
            : base(ConfigurationManager.ConnectionStrings["ConnectionStringName"].ConnectionString)
        {

            OnCreated();

        }

4. Enjoy!

Full article and inspiration exist here.